使用逗号和点分析string以加倍

我正在尝试编写一个基本上将string数组转换为string数组的函数,其中数组中的所有双精度值都被舍入为我设置的小数位数。 在数组中也可以有string,根本没有双精度值。

string[,] values = new string[1, 3]; values[0, 0] = "hello"; values[0, 1] = "0.123"; values[0, 2] = "0,123"; int decimalPlaces = 2; double tmp; string format = "F" + decimalPlaces.ToString(); IFormatProvider provider = CultureInfo.InvariantCulture; for (int i = 0; i < values.GetLength(0); i++) { for (int j = 0; j < values.GetLength(1); j++) { if (double.TryParse(values[i, j], out tmp)) { values[i, j] = tmp.ToString(format, provider); } } } Console.ReadLine(); 

结果必须是:“hello”,“0.12”,“0.12”,但是“hello”,“123.00”,“0.12”将以错误的方式处理逗号。 有没有人有一个简单而有效的解决scheme呢?

你想把点( . )像逗号( , )。 所以,更换

 if (double.TryParse(values[i, j], out tmp)) 

 if (double.TryParse(values[i, j].Replace('.', ','), out tmp)) 

要同时对待和。 作为小数点,你不能只replace一个,但也要确保文化使用parsing解释它作为一个小数点。

 text = text.Replace(',', '.'); return double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out value); 

你不需要replace逗号和点..

我有同样的问题。 原因很简单,转换文化起着很大的作用,逗号或点被解释。 我使用德国文化,逗号区分分数,其他地方的分数就是这个分数。

在这里我做了一个完整的例子,以明确区别。

 string[] doubleStrings = {"hello", "0.123", "0,123"}; double localCultreResult; foreach (var doubleString in doubleStrings) { double.TryParse(doubleString, NumberStyles.Any, CultureInfo.CurrentCulture, out localCultreResult); Console.WriteLine(string.Format("Local culture results for the parsing of {0} is {1}",doubleString,localCultreResult)); } double invariantCultureResult; foreach (var doubleString in doubleStrings) { double.TryParse(doubleString, NumberStyles.Any, CultureInfo.InvariantCulture, out invariantCultureResult); Console.WriteLine(string.Format("Invariant culture results for the parsing of {0} is {1}", doubleString, invariantCultureResult)); } 

结果在哪里 在这里输入图像描述

玩文化,你会得到你需要的结果。

问题是你(或系统)不能区分千位分隔符的小数点分隔符,它们可以是逗号或点。 例如:

在我的文化里,

1.123是1000以上数字的正常表示法; 而

1,123是接近1的数字。

使用不变文化默认使用点作为小数点分隔符。 一般来说,你应该确保所有数字都是在所有系统上使用相同的恒定文化(例如不变文化)。

如果你确定你的数字从不包含逗号或小数点分隔符(即没有数千个分隔符)以外的任何东西,我会用逗号将String.Replace()逗号和剩下的一样做。

否则,你将很难编程一些能够区分1.123而不知道文化的东西。

您可以检查string是否包含小数点

string s="";

  if (s.Contains(',')) { //treat as double how you wish } 

然后把它作为一个小数,否则只是传递非double值。

使用double.TryParse的这个重载来指定允许的格式:

Double.TryParse方法(String,NumberStyles,IFormatProvider,Double%)

默认情况下,double.TryParse将根据当前文化特定的格式进行parsing。

试试这个…它适用于我。

 double vdouble = 0; string sparam = "2,1"; if ( !Double.TryParse( sparam, NumberStyles.Float, CultureInfo.InvariantCulture, out vdouble ) ) { if ( sparam.IndexOf( '.' ) != -1 ) { sparam = sparam.Replace( '.', ',' ); } else { sparam = sparam.Replace( ',', '.' ); } if ( !Double.TryParse( sparam, NumberStyles.Float, CultureInfo.InvariantCulture, out vdouble ) ) { vdouble = 0; } } 

扩展来parsingstring中的十进制数字。

  • 无论数字是在开始,结尾还是在string中间。
  • 不pipe是只有数字还是很多“垃圾”字母。
  • 无论在PC上的文化设置中configuration了什么分隔符,它都能正确parsing点和逗号。
  • 可手动设置小数点符号。

     public static class StringExtension { public static double DoubleParseAdvanced(this string strToParse, char decimalSymbol = ',') { string tmp = Regex.Match(strToParse, @"([-]?[0-9]+)([\s])?([0-9]+)?[." + decimalSymbol + "]?([0-9 ]+)?([0-9]+)?").Value; if (tmp.Length > 0 && strToParse.Contains(tmp)) { var currDecSeparator = System.Windows.Forms.Application.CurrentCulture.NumberFormat.NumberDecimalSeparator; tmp = tmp.Replace(".", currDecSeparator).Replace(decimalSymbol.ToString(), currDecSeparator); return double.Parse(tmp); } return 0; } } 

如何使用:

 "It's 4.45 O'clock now".DoubleParseAdvanced(); // will return 4.45 "It's 4,45 O'clock now".DoubleParseAdvanced(); // will return 4.45 "It's 4:45 O'clock now".DoubleParseAdvanced(':'); // will return 4.45