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
作为最终结果。但如果您愿意,可以使用 float
或 double
。一般方法仍然有效。
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;
}
我正在做一个需要解析文件中的数据并将其存储到 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
作为最终结果。但如果您愿意,可以使用 float
或 double
。一般方法仍然有效。
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;
}