我认为如果值来自用户输入,则不可能100%正确转换。例如,如果值为123.456,则它可以是分组或小数点。如果您确实需要100%的准确性,您必须描述您的格式,并在其不正确时引发异常。
但是,我改进了JanW的代码,使我们更接近100%。其背后的想法是,如果最后一个分隔符是组分隔符,则这更像是整数类型而不是double。
添加的代码在GetDouble的第一个if中。
void Main()
{
List<string> inputs = new List<string>() {
"1.234.567,89",
"1 234 567,89",
"1 234 567.89",
"1,234,567.89",
"1234567,89",
"1234567.89",
"123456789",
"123.456.789",
"123,456,789,"
};
foreach(string input in inputs) {
Console.WriteLine(GetDouble(input,0d));
}
}
public static double GetDouble(string value, double defaultValue) {
double result;
string output;
string groupSep = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator;
if (value.LastIndexOf(groupSep) + 4 == value.Count())
{
bool tryParse = double.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CurrentCulture, out result);
result = tryParse ? result : defaultValue;
}
else
{
output = value.Trim().Replace(" ", string.Empty).Replace(",", ".");
string[] split = output.Split('.');
if (split.Count() > 1)
{
output = string.Join(string.Empty, split.Take(split.Count()-1).ToArray());
output = string.Format("{0}.{1}", output, split.Last());
}
result = double.Parse(output, System.Globalization.CultureInfo.InvariantCulture);
}
return result;
}