我想把“3.5”这样的字符串解析为double。然而,

double.Parse("3.5") 

收益率为35和

double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint) 

抛出一个FormatException。

现在我的计算机的区域设置为德语,其中逗号用作小数分隔符。它可能需要做一些事情,double.Parse()期望“3,5”作为输入,但我不确定。

如何解析包含十进制数字的字符串,该十进制数字可能是或可能不是我当前地区指定的格式?


当前回答

我正在开发一个。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;
   }

其他回答

double.Parse("3.5", CultureInfo.InvariantCulture)
System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture;

string _pos = dblstr.Replace(".",
    ci.NumberFormat.NumberDecimalSeparator).Replace(",",
        ci.NumberFormat.NumberDecimalSeparator);

double _dbl = double.Parse(_pos);

这里有一个解决方案,可以处理包含逗号和句点的任何数字字符串。这种解决方案特别适用于金额,因此只需要十分位和百分之一位。任何超过的数都被视为整数。

首先删除不是数字、逗号、句号或负号的任何内容。

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等。

诀窍是使用不变区域性,来解析所有区域性中的dot。

double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.NumberFormatInfo.InvariantInfo);

我也改进了@JanW的代码…

我需要它来格式化医疗器械的结果,他们还发送了“>1000”,“23.3e02”,“350E-02”和“NEGATIVE”。

private string FormatResult(string vResult)
{
  string output;
  string input = vResult;

  // 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());
  }
  string sfirst = output.Substring(0, 1);

  try
  {
    if (sfirst == "<" || sfirst == ">")
    {
      output = output.Replace(sfirst, "");
      double res = Double.Parse(output);
      return String.Format("{1}{0:0.####}", res, sfirst);
    }
    else
    {
      double res = Double.Parse(output);
      return String.Format("{0:0.####}", res);
    }
  }
  catch
  {
    return output;
  }
}