我正在尝试编写一个函数,它基本上将字符串数组转换为字符串数组,其中数组中的所有双精度数都舍入为我设置的小数位数.数组中也可以有字符串,它们根本没有双重值.
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();
Run Code Online (Sandbox Code Playgroud)
结果必须是:"你好","0.12","0.12",但它是"你好","123.00","0.12"将以错误的方式对待逗号.有没有人有一个简单而有效的解决方案?
hul*_*ist 131
对待两者,和.作为小数点,您不仅必须将其替换为另一个,还要确保Culture使用的解析将其解释为小数点.
text = text.Replace(',', '.');
return double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out value);
Run Code Online (Sandbox Code Playgroud)
Oli*_*sad 33
你不需要替换逗号和点..
我遇到了同样的问题.原因很简单,转换文化在解释逗号或点的过程中发挥着重要作用.我使用德国文化,其中逗号区分分数,其他地方的点可以完成工作.
在这里,我做了一个完整的例子,以明确区别.
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));
}
Run Code Online (Sandbox Code Playgroud)
结果如下

玩弄文化,您将获得所需的结果.
mmd*_*bas 26
你想像点.逗号(,)一样对待dot ().所以,替换
if (double.TryParse(values[i, j], out tmp))
Run Code Online (Sandbox Code Playgroud)
同
if (double.TryParse(values[i, j].Replace('.', ','), out tmp))
Run Code Online (Sandbox Code Playgroud)
Dan*_*ker 16
问题是当(或系统)可以是逗号或点时,您(或系统)无法区分小数分隔符和千位分隔符.例如:
在我的文化中,
1.123是1000以上数字的正常表示法; 而
1,123是一个接近1的数字.
使用不变文化默认使用点作为小数分隔符.通常,您应该确保所有数字都使用相同的常量文化在所有系统上编写(例如,不变文化).
如果您确定您的数字从不包含除小数分隔符的逗号或点以外的任何内容(即没有数千个分隔符),我会String.Replace()用逗号加点,然后像您一样完成其余操作.
否则,你将很难编程一些可以1.123在1,123不了解文化的情况下进行区分的东西.
制作两种静态区域性,一种用于逗号,一种用于点。
var commaCulture = new CultureInfo("en")
{
NumberFormat =
{
NumberDecimalSeparator = ","
}
};
var pointCulture = new CultureInfo("en")
{
NumberFormat =
{
NumberDecimalSeparator = "."
}
};
Run Code Online (Sandbox Code Playgroud)
然后根据输入分别使用每一个(使用函数):
public double ConvertToDouble(string input)
{
input = input.Trim();
if (input == "0") {
return 0;
}
if (input.Contains(",") && input.Split(',').Length == 2)
{
return Convert.ToDouble(input, commaCulture);
}
if (input.Contains(".") && input.Split('.').Length == 2)
{
return Convert.ToDouble(input, pointCulture);
}
throw new Exception("Invalid input!");
}
Run Code Online (Sandbox Code Playgroud)
然后循环遍历你的数组
var strings = new List<string> {"0,12", "0.122", "1,23", "00,0", "0.00", "12.5000", "0.002", "0,001"};
var doubles = new List<double>();
foreach (var value in strings) {
doubles.Add(ConvertToDouble(value));
}
Run Code Online (Sandbox Code Playgroud)
即使宿主环境和文化发生变化,这也应该有效。
小智 7
简单使用:
double.Parse("3.5", CultureInfo.InvariantCulture)
Run Code Online (Sandbox Code Playgroud)