首页 > 解决方案 > 将丹麦语双精度转换为带有多个“。”的字符串 分隔符 [千]

问题描述

我正在尝试将string格式中的数字转换为double. 它可以是英国文化或丹麦文化。这是我正在尝试的代码

public static double ToDoubleOrDefault(this string value)
{
    var doubleValue = default(double);

    var danishCultureInfo = new CultureInfo("da-DK");
    var englishCultureInfo = new CultureInfo("en-US");

    if (double.TryParse(value, 
                        NumberStyles.AllowDecimalPoint, 
                        englishCultureInfo, 
                        out doubleValue))
    {
        return doubleValue;
    }
    else if (double.TryParse(value, 
                             NumberStyles.AllowDecimalPoint,
                             danishCultureInfo, 
                             out doubleValue))
    {
        return doubleValue;
    }
    return doubleValue;
}

如果直到丹麦号码有多个 "." 分隔符,它就可以正常工作。

例如:“1.908.746”

有没有办法可以做到?

标签: c#

解决方案


我建议添加NumberStyles.AllowThousands

public static double ToDoubleOrDefault(this string value) {
  var doubleValue = default(double);

  // We don't have to create new instances (new CultureInfo()...)
  var danishCultureInfo = CultureInfo.GetCultureInfo("da-DK");
  var englishCultureInfo = CultureInfo.GetCultureInfo("en-US");

  if (double.TryParse(value, 
                      NumberStyles.AllowDecimalPoint, 
                      englishCultureInfo, 
                      out doubleValue)) 
    return doubleValue;
  else if (double.TryParse(value, 
                           NumberStyles.AllowDecimalPoint, 
                           danishCultureInfo, 
                           out doubleValue)) 
    return doubleValue;
  else if (double.TryParse(value, 
                           NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, 
                           englishCultureInfo, 
                           out doubleValue)) 
    return doubleValue;
  else if (double.TryParse(value, 
                           NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, 
                           danishCultureInfo, 
                           out doubleValue)) 
    return doubleValue;

  return doubleValue;
}

所以我们尝试将给定string视为

  1. 不带千位分隔符的英文浮点数,例如123456789.1
  2. 没有千位分隔符的丹麦浮点数,例如123456789,1
  3. 带千位分隔符的英文浮点数,例如123,456,789.1
  4. 带有千位分隔符的丹麦浮点数,例如123.456.789,1

请注意,这里有一个歧义123.456is 123.456(英语,since.小数分隔符)和123456(丹麦语,since.位分隔符)


推荐阅读