代码之家  ›  专栏  ›  技术社区  ›  Dan Herbert

我可以在.NET中将字符串格式化为数字吗?

  •  4
  • Dan Herbert  · 技术社区  · 16 年前

    如果我有这样的电话号码

    string phone = "6365555796";
    

    我只在数据库中存储数字字符 (作为字符串) ,是否可以输出这样的数字:

    "636-555-5796"
    

    类似于如果我使用的是一个数字:

    long phone = 6365555796;
    string output = phone.ToString("000-000-0000");
    

    我尝试过搜索,在网上找到的只是数字格式的文档。

    我之所以问这个问题,是因为我认为能在数据库中只存储数值,并允许使用常量字符串值来指定如何格式化我的电话号码是一个有趣的想法。还是我最好用一个数字来做这个?

    编辑:问题是要格式化包含数字的字符串,而不是数字本身。

    9 回复  |  直到 16 年前
        1
  •  7
  •   Esteban Brenes    16 年前

    我能想到的最好的方法是不必转换为长/数,因此它只适合一行:

    string number = "1234567890";
    string formattedNumber = string.Format("{0}-{1}-{2}", number.Substring(0,3), number.Substring(3,3), number.Substring(6));
    
        2
  •  6
  •   Dour High Arch    16 年前

    请注意,并非每个人都使用北美3-3-4格式的电话号码。欧洲电话号码最长可达15位,标点符号很明显,例如+44-XXXX-XXXX-XXXX不同于44+XXXX-XXXX-XXXX。您也不考虑PBX和扩展,这可能需要超过30位数字。

    军事和无线电电话可以有字母字符,不,这不是“2”=“ABC”你看到的触摸式电话。

        3
  •  6
  •   Joel Coehoorn    16 年前

    简单版本:

    string phone = "6365555796";
    Convert.ToInt64(phone).ToString("000-000-0000");
    

    要围绕这一点进行一些验证,并将其放在一个好方法中:

    string FormatPhone(string phone)
    {
       /*assume the phone string came from the database, so we already know it's
         only digits.  If this changes in the future a simple RegEx can validate 
         (or correct) the digits requirement. */
    
       // still want to check the length:
       if (phone.Length != 10) throw new InvalidArgumentException();
    
      return Convert.ToInt64(phone).ToString("000-000-0000");
    }
    
        4
  •  4
  •   AJ.    16 年前

    我想这个行

    string s = string.Format("{0:###-###-####}", ulong.Parse(phone));
    

    另外,这个 http://blog.stevex.net/index.php/string-formatting-in-csharp/ 是一篇关于在.NET中设置字符串格式的好文章。

    感谢@swilliams的澄清。

        5
  •  1
  •   Stu Mackellar    16 年前

    为什么不做这样的事呢?

    string phoneText = "6365555796";
    long phoneNum = long.Parse(phoneText);
    string output = phoneNum.ToString("000-000-0000");
    
        6
  •  1
  •   Jesse C. Slicer    16 年前

    我爱我一些扩展方法动作:

       /// <summary>
       ///   Formats a string of nine digits into a U.S. phone number.
       /// </summary>
       /// <param name="value">
       ///   The string to format as a phone number.
       /// </param>
       /// <returns>
       ///   The numeric string as a U.S. phone number.
       /// </returns>
       public static string
       ToUSPhone (this string value)
       {
          if (value == null)
          {
             return null;
          }
    
          long  dummy;
    
          if ((value.Length != 10) ||
             !long.TryParse (
                value,
                NumberStyles.None,
                CultureInfo.CurrentCulture,
                out dummy))
          {
             return value;
          }
    
          return string.Format (
             CultureInfo.CurrentCulture,
             "{0}-{1}-{2}",
             value.Substring (0, 3),
             value.Substring (3, 3),
             value.Substring (6));
       }
    
        7
  •  0
  •   Jeremy Reagan    16 年前

    您可以在给定的字符点执行字符串插入。有点像: phone=phone.insert(3,“-”); phone=phone.insert(7,“-”);

        8
  •  0
  •   Mark Brackett Achilles Ram Nakirekanti    16 年前

    当然:

    Regex.Replace(phone, @"^(\d{3})(\d{3})(\d{4})$", @"$1-$2-$3")
    

    当然, now you have 2 problems .

        9
  •  -1
  •   gimel    16 年前

    若要控制数字的字符串格式以在ASP.NET网格视图或其他控件中显示,可以将项包装在助手类中以用于显示:

    public class PhoneDisplay
    {
        long phoneNum;
        public PhoneDisplay(long number)
        {
            phoneNum = number;
        }
        public override string ToString()
        {
            return string.Format("{0:###-###-####}", phoneNum);
        }
    
    }
    

    然后,将数据或显示字段定义为(例如):

    PhoneDisplay MyPhone = new PhoneDisplay(6365555796);