C# 使用自定义格式字符串将字符串解析为int/long

C# 使用自定义格式字符串将字符串解析为int/long,c#,.net,parsing,int,custom-formatting,C#,.net,Parsing,Int,Custom Formatting,在C#.Net中,下面是一个简单的示例,说明如何使用自定义格式字符串将数字格式化为字符串: (示例取自:) 有没有办法将此格式化字符串转换回长/整数?有没有办法做到这一点: long PhoneNumber = Int32.Parse("89-5871-2551", "{0:##-####-####}"); 我看到DateTime有一个方法可以很好地完成这项工作。但是对于int/long/decimal/double,我没有看到任何这样的东西。只需将所有非数字字符正则化,然后解析该字符串。好吧

在C#.Net中,下面是一个简单的示例,说明如何使用自定义格式字符串将数字格式化为字符串: (示例取自:)

有没有办法将此格式化字符串转换回长/整数?有没有办法做到这一点:

long PhoneNumber = Int32.Parse("89-5871-2551", "{0:##-####-####}");

我看到DateTime有一个方法可以很好地完成这项工作。但是对于int/long/decimal/double,我没有看到任何这样的东西。

只需将所有非数字字符正则化,然后解析该字符串。

好吧,您随时都可以这样做

long PhoneNumber = Int32.Parse("89-5871-2551".
                Replace(new char[]{'-','+',whatever..}).Trim());
顺便说一句,考虑到您正在解析从某个
IO
接收的字符串,我建议使用更安全的(转换方面的)方法


您所描述的方式实际上并不存在。

您可以对所有非数字数字进行正则化,剩下的是一个可以解析的数字字符串

var myPhoneNumber = "89-5871-2551";
var strippedPhoneNumber = Regex.Replace(myPhoneNumber, @"[^\d]", "");
int intRepresentation;

if (Int32.TryParse(strippedPhoneNumber, out intRepresentation))
{
    // It was assigned, intRepresentation = 8958712551
    // now you can use intRepresentation.

} else {
    // It was not assigned, intRepresentation is still null.
}

试试这个<代码>Int32.Parse(((“89-5871-2551”)。替换(“-”,”)----我下面的答案显示了如何在解析字符串之前删除多个连字符
-
。为什么要将电话号码存储为int/long?电话号码是一系列数字,而不是数值。如果您将其存储为字符串而不是整型数据类型,您的生活会更简单。@phoog:我只是以电话号码为例。我必须处理银行账号,这些账号的格式是以某种方式呈现的,这就是它从其他系统转储的方式。我不想使用字符串,因为帐号会参与很多比较,我们都知道字符串有多糟糕。该系统将处理超过2000万条记录,一次可能处理500万条;所以性能是个问题。转储就像CSV一样。解析逻辑是CSV库的一部分(由代码生成器和注释驱动),解决方案必须具有足够的通用性,以处理所有主要数据类型。因此,我最终选择使用正则表达式。不幸的是,我不得不使用单独的格式字符串进行序列化(使用格式字符串的ToString重载)和反序列化(regex去除不需要的字符,然后进行解析),这是我试图避免的。这是一个有点痛苦的二次猜测用户在其电话号码中输入的每个可能的字符<代码>{'-'、'.'''、'+'、'*'、'/'、'\'、'.''.'、'''.'、''.'等等。@ChaseFlorell:我假设提供的程序得到了一些预期的输入,如果该字符串中可能出现的符号计数变化太多,是的,最好使用
正则表达式
。但除非有,否则你可能是对的,但我知道,如果你对用户进行彻底的验证,要求他们准确输入你对他们的期望,用户会感到沮丧。您最好在前端表现得优雅(更好的用户体验),而代价是额外的几个cpu周期深入到所需的数据。
var myPhoneNumber = "89-5871-2551";
var strippedPhoneNumber = Regex.Replace(myPhoneNumber, @"[^\d]", "");
int intRepresentation;

if (Int32.TryParse(strippedPhoneNumber, out intRepresentation))
{
    // It was assigned, intRepresentation = 8958712551
    // now you can use intRepresentation.

} else {
    // It was not assigned, intRepresentation is still null.
}