【问题标题】:UInt32.TryParse() hex-number not workingUInt32.TryParse() 十六进制数不起作用
【发布时间】:2010-05-10 09:15:58
【问题描述】:

由于某种原因,以下 C# 控制台程序总是输出:

32
假的
wtf=0

我做错了什么?

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Convert.ToUInt32("0x20", 16));
            UInt32 wtf = 0;
            Console.WriteLine(UInt32.TryParse("0x20",
                              NumberStyles.HexNumber, // I've tried also AllowHexSpecifier
                              CultureInfo.InvariantCulture,  // I've also tried CurrentCulture
                              out wtf));
            Console.WriteLine("wtf={0}", wtf);
        }
    }
}

【问题讨论】:

  • IIRC,Java 有同样的愚蠢。
  • 尽管有它的名字,AllowHexSpecifier 不允许任何十六进制说明符。它只是将事物解释为十六进制。 :-/

标签: c# tryparse


【解决方案1】:

您需要删除“0x”前缀。请看this blog entry

【讨论】:

  • 你说得对。那么,每个 C# 程序员是否手动“修剪”任何“0x”(如果存在)或者是否有捷径?顺便说一句:只要允许我,我就会接受这个作为解决方案:-)
  • 哇。这接近我要说的错误。
  • @S.C. Madsen:当我在早期项目中需要此功能时,我想我是“手动”“修剪”的。不漂亮,但效果很好......
  • Peter:我已经在我的应用程序中做了同样的事情。我真的认为这是 TryParse() 方法的一个主要缺点。
  • 来自NumberStyles EnumerationAllowHexSpecifier使用该样式解析的字符串不能以“0x”或“&h”为前缀。跨度>
【解决方案2】:
// stupid but effective way to improve the parsing
char[] _trim_hex = new char[] {'0','x'};
int temp;

if (int.TryParse(value.TrimStart(_trim_hex), NumberStyles.HexNumber, null, out temp))
{
    // temp is good
}

【讨论】:

  • 为什么不只是前 2 个字符的子字符串?如果值为“0XFFFF”怎么办?我猜你也可以.toLower()这个字符串
【解决方案3】:

去掉你要解析的字符串中的前导“0x”。

【讨论】:

    【解决方案4】:

    另见http://msdn.microsoft.com/en-us/library/kadka85s%28v=VS.100%29.aspx 在页面底部的示例中:

    尝试转换“0x8F8C”失败。

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 2015-11-18
      • 2016-01-17
      • 1970-01-01
      • 2018-02-23
      • 2018-06-28
      相关资源
      最近更新 更多