C#数字不同格式

C# number different formats

我正在做一个需要解析文件中的数据并将其存储到 MySQL 数据库的项目 该文件具有多种格式的以下字符串

Ava. bytes -> 147.258.369
Ava. bytes -> 147.258.369,5
Ava. bytes -> 147,258,369
Ava. bytes -> 147,258,369.5

将这些格式中的任何一种转换为

的最佳方法是什么
Ava. bytes -> 147.258.369 => 147258369.0
Ava. bytes -> 147.258.369,5 =>147258369.5
Ava. bytes -> 147,258,369 => 147258369.0
Ava. bytes -> 147,258,369.5 =>147258369.5

谢谢!

我基本上是通过评论来解释解决方案, 这样您就可以单独阅读评论并了解想法。

请注意,我使用 decimal 作为最终结果。但如果您愿意,可以使用 floatdouble。一般方法仍然有效。

string str = "123,456.7";

// Check if its a simple integer (no floating point or thousands separators)
if (str.Length <= 3)
    return (decimal)int.Parse(str);

// Get the floating-point character from the string
char floatingPointChar = str[str.Length - 2];

// Based on the floating-point character,
//   we assure the string is in a standard format of "000,000.0"
switch (floatPointChar)
{
    case '.':
        // If the floating point is a .
        //   the number is already in a standard format
        break;
    case ',':
        // put ~ as a temporary floating-point character
        str = str.Replace(',', '~');

        // turn dots into thousand separators
        str = str.Replace('.', ',');

        // put . as floating-point character
        str = str.Replace('~', '.');
        break;
    default:
        // There is actually no floating point,
        //   so just make sure thousand separators are ,
        str = str.Replace('.', ',');
        break;
}

// Now our string is in a standard format
//   , for thousands separators
//   . for floating point
return decimal.Parse(str, CultureInfo.InvariantCulture);

编辑:我完全忽略了可以完全省略千位分隔符的事实。查看 null 的回答以获得更多灵感

您可以使用正则表达式删除后跟三位数字的任何点或逗号,如果有一个句点,则可以使用字符串替换来替换最后的小数点逗号:

string n = "147.258.369,5";
var r = new Regex(@"[.,](?=\d{3})");
string n2 = r.Replace(n, "").Replace(',', '.');

编辑:

如果您想将字符串解析为小数,则该字符串为 InvariantFormat(但可能您需要该字符串,因为 .0 很重要。)

包括最后的.0:

if (n2.Length < 2 || n2[n2.Length - 2] != '.')
{
    n2 = n2 + ".0";
}

这是一种非常讨厌的做法:

  private static string FormatIntString(string input)
    {
        if (input.IndexOf('.') != input.LastIndexOf('.')) 
        {
            if (input.Contains(","))
            {
                //this case-> Ava.bytes -> 147.258.369,5 =>147258369.5
                return DoFormat(input.Replace(".", "").Replace(',', '.'));
            }
            else
            {
                // this case->  Ava.bytes -> 147.258.369 => 147258369.0
                return DoFormat(input.Replace(".", ""));                   
            }
        }
        else
        {
            if (input.Contains('.'))
            {
                //this case -> Ava.bytes -> 147,258,369.5 =>147258369.5
                return DoFormat(input.Replace(",", ""));                   
            }
            else
            {
                //this case -> Ava.bytes -> 147,258,369 => 147258369.0
                return DoFormat(input.Replace(",", ""));
            }
        }
    }
    public static string DoFormat(string myNumber)
    {
        var s = string.Format("{0:0.00}", myNumber);
        if (s[s.Length-2] != '.')            
            return (myNumber + ".0");            
        else            
            return s;            
    }

请记住,这仅适用于至少包含两个“,”或“.”的字符串。

简化代码:

 private static string FormatIntString(string input)
    {
        if (input.IndexOf('.') != input.LastIndexOf('.'))
            if (input.Contains(","))
                return DoFormat(input.Replace(".", "").Replace(',', '.'));
            else
                return DoFormat(input.Replace(".", ""));
        else            
            if (input.Contains('.'))
                return DoFormat(input.Replace(",", ""));
            else
                return DoFormat(input.Replace(",", ""));            
    }

    public static string DoFormat(string myNumber)
    {
        var s = string.Format("{0:0.00}", myNumber);
        if (s[s.Length - 2] != '.')
            return (myNumber + ".0");
        else
            return s;
    }