我想把“3.5”这样的字符串解析为double。然而,
double.Parse("3.5")
收益率为35和
double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint)
抛出一个FormatException。
现在我的计算机的区域设置为德语,其中逗号用作小数分隔符。它可能需要做一些事情,double.Parse()期望“3,5”作为输入,但我不确定。
如何解析包含十进制数字的字符串,该十进制数字可能是或可能不是我当前地区指定的格式?
下面的代码在任何场景下都可以完成这项工作。这是一点解析。
List<string> inputs = new List<string>()
{
"1.234.567,89",
"1 234 567,89",
"1 234 567.89",
"1,234,567.89",
"123456789",
"1234567,89",
"1234567.89",
};
string output;
foreach (string input in inputs)
{
// Unify string (no spaces, only .)
output = input.Trim().Replace(" ", "").Replace(",", ".");
// Split it on points
string[] split = output.Split('.');
if (split.Count() > 1)
{
// Take all parts except last
output = string.Join("", split.Take(split.Count()-1).ToArray());
// Combine token parts with last part
output = string.Format("{0}.{1}", output, split.Last());
}
// Parse double invariant
double d = double.Parse(output, CultureInfo.InvariantCulture);
Console.WriteLine(d);
}
var doublePattern = @"(?<integer>[0-9]+)(?:\,|\.)(?<fraction>[0-9]+)";
var sourceDoubleString = "03444,44426";
var match = Regex.Match(sourceDoubleString, doublePattern);
var doubleResult = match.Success ? double.Parse(match.Groups["integer"].Value) + (match.Groups["fraction"].Value == null ? 0 : double.Parse(match.Groups["fraction"].Value) / Math.Pow(10, match.Groups["fraction"].Value.Length)): 0;
Console.WriteLine("Double of string '{0}' is {1}", sourceDoubleString, doubleResult);
我正在开发一个。net Maui应用程序,可以在Windows、Mac、Android和iPhone上运行。我有3个双精度值,我解析和存储使用'。(如。“32.5”)在所有情况下:纬度、经度和海拔。我碰巧将Android和iPhone设置为西班牙语,并注意到Android会解析'。字符串很好。但是,iPhone拒绝正确解析它,除非我用','代替'.'。否则,结果总是一个巨大的数字。
我没有处理复杂的本地化问题,而是提出了一个简单的解决方案,即利用双数字的特定限制。
case "Lat":
waypoint.Lat = ParseDouble(xmlVal, 90);
break;
case "Lon":
waypoint.Lon = ParseDouble(xmlVal, 180);
break;
case "Alt":
waypoint.Alt = ParseDouble(xmlVal, 32000);
public static double ParseDouble(string val, double limit)
{
double result;
if (double.TryParse(val, out result))
{
if (Math.Abs(result) <= limit)
return result;
else if (double.TryParse(val.Replace('.', ','), out result))
{
if (Math.Abs(result) <= limit)
return result;
}
}
return 0;
}
这里有一个解决方案,可以处理包含逗号和句点的任何数字字符串。这种解决方案特别适用于金额,因此只需要十分位和百分之一位。任何超过的数都被视为整数。
首先删除不是数字、逗号、句号或负号的任何内容。
string stringAmount = Regex.Replace(originalString, @"[^0-9\.\-,]", "");
然后我们把这个数分成整数和十进制数。
string[] decimalParsed = Regex.Split(stringAmount, @"(?:\.|,)(?=\d{2}$)");
(这个Regex表达式选择一个逗号或句号,它距离字符串的末尾有两个数字。)
现在我们取整个数字,去掉逗号和句号。
string wholeAmount = decimalParsed[0].Replace(",", "").Replace(".", "");
if (wholeAmount.IsNullOrEmpty())
wholeAmount = "0";
现在我们处理小数部分。
string decimalAmount = "00";
if (decimalParsed.Length == 2)
{
decimalAmount = decimalParsed[1];
}
最后,我们可以把整数和小数放在一起并解析Double。
double amount = $"{wholeAmount}.{decimalAmount}".ToDouble();
这将处理200、00、1 000、00、1,000、1.000、33、2,000.000、78等。