使用逗号和点分析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