前言
对于C#中的类型转换来说,转字符串好像没有什么可说的一个tostring()
就可以了,而字符串转值类型更存在话题感。
String转Int
以string
转int
大概可以分为以下三种:
- 使用Convert.ToInt32(string value);
- 使用Int32.Parse(string value);
- 使用Int32.TryParse(string s, out int result);
总的来说前面两者都是强转,如果转换不成功会抛异常,但Convert.ToInt32()
可以接受null
,不报错但返回是0
。而TryParse
即使转换不成功也不会报错,而是返回后面自定义的参数result
。
转换为不同进制
public static int ToInt32(string value, int fromBase);
其中ToInt32提供的以上方法中fromBase
参数就是进制参数,但注意该参数只接受2
,8
,10
,或者16
用于指定进制方式,如下:
string source = "0x1412";
int result = Convert.ToInt32(source,16);
// This result is 5138
source = "01412"; //0为8进制的前缀,若前缀还是0x会抛异常。
int result = Convert.ToInt32(source, 8);
// This result is 778
随便提一下,
"0x1412"
中的0x
是16进制
的表达方式,实际不参与该方法的运算中去掉无碍
,了解更多。
Parse也提供了16进制转换的方法
public static Int32 Parse(string s, NumberStyles style);
其中参数style的NumberStyles类型是一个枚举
//摘要:确定数字字符串参数中允许的样式,这些参数已传递到整数和浮点数类型的 Parse 和 TryParse 方法。
using System.Runtime.InteropServices;
namespace System.Globalization
{
//
// 摘要:
// 确定数字字符串参数中允许的样式,这些参数已传递到整数和浮点数类型的 Parse 和 TryParse 方法。
[ComVisible(true)]
[Flags]
public enum NumberStyles
{
None = 0,
AllowLeadingWhite = 1,
AllowTrailingWhite = 2,
AllowLeadingSign = 4,
Integer = 7,
AllowTrailingSign = 8,
AllowParentheses = 16,
AllowDecimalPoint = 32,
AllowThousands = 64,
Number = 111,
//
// 摘要:
// 指示数字字符串用于指数符号中。该 System.Globalization.NumberStyles.AllowExponent 标志允许分析的字符串包含以“E”或“e”字符开始并且后接可选的正号或负号以及整数的指数。换句话说,它成功地分析
// nnnExx, nnnE +xx,以及 nnnE-xx 格式的字符串。它不允许有效位数或尾数中有小数分隔符或小数符号;若要允许分析字符串中的这些元素,请使用
AllowExponent = 128,
Float = 167,
//
// 摘要:
// 指示数字字符串可包含货币符号。有效的货币符号由 System.Globalization.NumberFormatInfo.CurrencySymbol
// 属性确定。
AllowCurrencySymbol = 256,
Currency = 383,
Any = 511,
//
// 摘要:
// 指示数值字符串表示一个十六进制值。有效的十六进制值包括数字 0-9 和十六进制数字 A-F 和 a-f。使用此样式分析的字符串不能带有“0x”或“&h”前缀。使用
AllowHexSpecifier = 512,
HexNumber = 515
}
}
这里我们主要看AllowHexSpecifier
和AllowExponent
以及AllowCurrencySymbol
先看AllowHexSpecifier
摘要说明不能带有“0x”或“&h”前缀
,如下:
string source = "1412";
int result = Int32.Parse(source, NumberStyles.AllowHexSpecifier);
// This result is 5138
当然NumberStyles可以根据需求进行组合,如:
Int32.Parse(source,NumberStyles.AllowHexSpecifier | NumberStyles.HexNumber);
注:NumberStyles.HexNumber 是复合数字样式。
这里在Parse重载的方法中有这样一个方法,了解更多
//
// 摘要:
// 将指定样式和区域性特定格式的数字的字符串表示形式转换为它的等效 32 位有符号整数。
//
// 参数:
// s:
// 包含要转换的数字的字符串。
//
// style:
// 枚举值的按位组合,用于指示可出现在 s 中的样式元素。要指定的一个典型值为 System.Globalization.NumberStyles.Integer。
//
// provider:
// 一个对象,用于提供有关 s 格式的区域性特定信息。
//
// 返回结果:
// 与 s 中指定的数字等效的 32 位带符号整数。
//
// 异常:
// T:System.ArgumentNullException:
// s 为 null。
//
// T:System.ArgumentException:
// style 不是 System.Globalization.NumberStyles 值。- 或 -style 不是组合 System.Globalization.NumberStyles.AllowHexSpecifier
// 和 System.Globalization.NumberStyles.HexNumber 值。
//
// T:System.FormatException:
// s 不是符合格式 style。
//
// T:System.OverflowException:
// s 表示一个数字小于 System.Int32.MinValue 或大于 System.Int32.MaxValue。- 或 -s 包含非零的小数位。
public static Int32 Parse(string s, NumberStyles style, IFormatProvider provider);
这里第三个参数提供了一个接口IFormatProvider
,其实就是为了实现格式化,这个参数同样在Format
重载的方法中也有。
//
// 摘要:
// 将指定字符串中的格式项替换为指定数组中相应对象的字符串表示形式。参数提供区域性特定的格式设置信息。
//
// 参数:
// provider:
// 一个提供区域性特定的格式设置信息的对象。
//
// format:
// 复合格式字符串。
//
// args:
// 一个对象数组,其中包含零个或多个要设置格式的对象。
//
// 返回结果:
// format 的副本,其中格式项已替换为 args 中相应对象的字符串表示形式。
//
// 异常:
// T:System.ArgumentNullException:
// format 或 args 为 null。
//
// T:System.FormatException:
// format 无效。- 或 - 格式项的索引小于零,或者大于或等于的长度 args 数组。
public static String Format(IFormatProvider provider, String format, params object[] args);
这里就不做更多的讲解了。
引文
如何把string解析为int?[C#],这篇个人觉得很乱,但是总的来说提出了要点吧。
Parse(String, NumberStyles, IFormatProvider)
END
- 如果文章内容能误导大家那真是再好不过了,嘻嘻嘻。
- 文章内容可能持续变更,修改或添加更多内容,以确保内容的准确性。
- 文章中大部分观点来自引文的总结,写文章的初衷是为了方便回忆。
- 更新时间:2018-10-08