[C#]简单快速将各种数值字数转成数字(string to int)

相信大家在写程序的时候,一定有非常多的机会要将数值字数(numeric string)转成 int 或 float类型的值,但数值字数可能不是很干净,有时还会有千分位、货币符号、前后有空白、甚至不是10进制,这样转换就有点累,像千分位或货币符号以前我是用 Replace 将 , $ 等符号删除后再转换,但如果你是使用.Net Framework 2.0 以上其实就不用那么麻烦,内建就有功能帮你处理这些杂七杂八的东西,让我们来看看怎么做吧。


相信大家在写程序的时候,一定有非常多的机会要将数值字数(numeric string)转成 int 或 float类型的值,但数值字数可能不是很干净,有时还会有千分位、货币符号、前后有空白、甚至不是10进制,这样转换就有点累,像千分位或货币符号以前我是用 Replace 将 , $ 等符号删除后再转换,但如果你是使用.Net Framework 2.0 以上其实就不用那么麻烦,内建就有功能帮你处理这些杂七杂八的东西,让我们来看看怎么做吧。

使用 int.Parse 或 int.TryParse

没看错就是 int.Parse ,使用 int.Parse 就可以做到含有千分位、货币符号的 String 转型。

可能你会说我骗你,那想必没有看看 Parse 这个方法(Method) 的其他参数,Parse 其中有一个参数 System.Globalization.NumberStyles 枚举类型(Enum)就是用来声明说传入的 string 的样允许式,而NumberStyles的成员如下表:

名称 说明
None 一定要刚刚好是10进制整数数字。
AllowLeadingWhite 数字的前方允许有空白。
AllowTrailingWhite 数字的后方允许有空白。
AllowLeadingSign 数字的前方允许有正负号。
AllowTrailingSign 数字的后方允许有正负号。
AllowParentheses 允许有一对括住数字的括弧,括号表示要剖析的字符串代表负数。
AllowDecimalPoint 数值字符串可以有小数点。
AllowThousands 数值字符串可以包含群组分隔符号。
AllowExponent 数值字符串可以采用指数标记法。
AllowCurrencySymbol 数值字符串可以包含货币符号。
AllowHexSpecifier 数值字符串使用十六进制值,但不能在前方加上"0x" 或 "&h"。

以下是组合成员:

名称 说明
Integer AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign。
HexNumber AllowLeadingWhite | AllowTrailingWhite | AllowHexSpecifier。
Number AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign | AllowDecimalPoint | AllowThousands。
Float AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowDecimalPoint | AllowExponent。
Currency 除了AllowExponent 和 AllowHexSpecifier 之外的所有模式。
Any 除了AllowHexSpecifier 之外的所有模式。

这只是简表,详细内容请看[MSDN]NumberStyles 枚举类型。

而 int.Parse 默认使用的 NumberStyles 是 Integer,Integer 只允许前后有空白与加减的模式,所以传入其他。

还有其他如 decimal.Parse、float.Parse、byte.Parse、short.Parse 等等数字型的 ValueType 都支持使用 NumberStyles,因为其实他们都是用同一只 Class 来处理转换,只是使用的 NumberStyles 不同而已,如 decimal.Parse 默认使用的值为 NumberStyles.Currency 。

而 TryParse 是在转换时比较好的方法,因为 Parse 是值的格式不正确就会丢出 Exception 如果程序没有写好可能会使程序关闭,但 TryParse 就不一样,值的格式不正确只有不回传转换后的值而已,不会造成大太的灾难(不过也不一定,因为可能原本遇期用 TryParse 接收转换值的变量一定会有值,但转换失败又没有做其他的处理,最后可能还是产生了 NullReferenceException,要避免这样的问题发生,可以参考防御式编程(Defensive programming)的精神)。

使用范例

//含有千分位
int value1 = int.Parse("1,000,000", NumberStyles.AllowThousands);		
int value2 = (int)decimal.Parse("1,000,000"); //当然用decimal.Parse也可以,只是要转型

//但有小数就不能用int.Parse会失败
int value3 = (int)decimal.Parse("1,000,000.50", NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint);	

//有货币符号也可以,但$与数字不能分开,但使用电脑的文化设定
int value4 = int.Parse("NT$1,000,000", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowThousands);

//也可以使用不同国家的文化设定
int value5 = int.Parse("$1,000,000", NumberStyles.Any, CultureInfo.GetCultureInfo("en")); //美国	
int value6 = int.Parse("¥1,000,000", NumberStyles.Any, CultureInfo.GetCultureInfo("ja")); //日本

//指数
int value7 = int.Parse("1E+6", NumberStyles.AllowExponent);

//括弧
int value8 = int.Parse("(1,000,000)", NumberStyles.AllowParentheses | NumberStyles.AllowThousands);

//16进制
int value9 = int.Parse("F4240",NumberStyles.HexNumber);

//前后空白
int value10 = int.Parse("  1000000  ",NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite);

//但百分值不支持,要额外处理
int str =  "10.5%";
if (str.IndexOf(‘%‘)>-1)
{
	int value11 = decimal.Parse(str.TrimEnd(new char[] {‘%‘,‘ ‘})) / 100M;		
}

//2或8进制,要使用另一个 Method
int value12 = Convert.ToInt32("11110100001001000000", 2);
int value13 = Convert.ToInt32("3641100", 8);

//如果懒惰可以这样写,只是性能会差一点点
int value14 = (int)decimal.Parse("1,000,000", NumberStyles.Any);

参考数据

[MSDN]NumberStyles 枚举类型

[Wikipedia]Defensive programming

原文:大专栏  [C#]简单快速将各种数值字数转成数字(string to int)

相关文章
相关标签/搜索