【问题标题】:C# doubt, finding the datatypeC#疑问,寻找数据类型
【发布时间】:2010-10-11 00:27:49
【问题描述】:

我有以下变量:

string str1 = "1";
string str2 = "asd";
string str3 = "3.5";
string str4 = "a";

现在我需要找到每个字符串的数据类型,即删除引号后可以转换的数据类型。这是我希望每个变量转换为的内容:

str1 - 整数
str2 - 字符串
str3 - 双
str4 - 字符

注意:如果字符串有单个字符,它应该是char,虽然一个字符串可以有单个字母,我限制它。

仅供参考:这些值是从我手动输入值的 DataGrid 中获得的。所以一切都变成了一个字符串。 有没有办法做到这一点?

【问题讨论】:

  • 我想知道你的代码试图做什么,因为我见过的很多执行自定义解析的应用程序通常可以使用四种数据类型:十进制、字符串、日期时间, 和布尔值。

标签: c# parsing types


【解决方案1】:

当然,没有明确的方法可以做到这一点,但是如果您创建一个要按优先级排序的数据类型列表,那么类似这样的方法可能会奏效。

object ParseString(string str)
{
    int intValue;
    double doubleValue;
    char charValue;
    bool boolValue;

    // Place checks higher if if-else statement to give higher priority to type.
    if (int.TryParse(str, out intValue))
        return intValue;
    else if (double.TryParse(str, out doubleValue))
        return doubleValue;
    else if (char.TryParse(str, out charValue))
        return charValue;
    else if (bool.TryParse(str, out boolValue))
        return boolValue;

    return null;
}

只需在每个字符串上调用此函数,您就会返回适当类型的对象。一个简单的类型检查可以告诉你字符串是如何被解析的。

【讨论】:

    【解决方案2】:

    使用元数据,如果可以的话

    您必须猜测数据类型是什么,这不是一个好主意。

    两件事

    1 数据从何而来?

    如果是数据库,你确定它们是字符串吗? 如果是数据库,应该返回一些元数据,告诉你字段的数据类型是什么。

    如果它是一个 Xml 文件,是否定义了一个模式来为您提供类型?

    2如果非要继续猜的话。

    请注意,您可以有恰好是数字的字符串,但它们是完全有效的字符串,例如电话号码、银行帐户号码,最好用字符串表示。 这些数字也可以有很多位,如果将它们转换为双精度数,您可能会将一些数字丢失为浮点不准确(您应该可以达到 14 或 15 位)

    我现在确定 - 因为我已经花时间输入这个 - 有很多答案告诉你如何做到这一点(即首先尝试解析 int,然后加倍,然后测试 char 的长度,如果不是,那么它是一个字符串等),但如果我是你,我会尽量不这样做,看看是否有任何方法可以获得,或者传递一些元数据来告诉你它是什么类型 而不仅仅是它可能是什么类型

    【讨论】:

    • +1 猜测数据类型通常意味着在不同级别上存在问题。
    • +1 不要试图猜测类型,除非你真的真的真的……真的需要。
    • 仅供参考:这些值是从我手动输入值的 DataGrid 获得的。所以一切都变成了一个字符串。
    • 我也使用了单独的方法来检查数据类型的边界值。
    • 为什么不将网格绑定到强类型数据源(它可以只是对象的集合),或者你可以在网格定义中为每一列指定不同的类型(我想,我是老实说,不在数据网格上)
    【解决方案3】:

    使用每种类型的TryParse 方法。

    【讨论】:

    • @ck: 只是优先考虑尝试:从窄 (int) 开始并朝着更广泛的类型 (double) 努力。
    【解决方案4】:

    没有内置的方法可以做到这一点,您可以尝试对数字类型进行 TryParse 以提高精度,但它不能保证它是正确的。

    最好的办法是像手动一样处理它。即有小数位吗?不 - 然后它是一个整数。多大?是负数吗?

    【讨论】:

      【解决方案5】:

      每个项目的数据类型都是字符串。如果您想尝试将它们解析为不同的类型,您可以使用 Int32.TryParse、Double.TryParse 等。或者您可以使用 Regex:

      bool isInt = new Regex(@"^\d+$").IsMatch(str);
      bool isDouble = !(isInt) && new Regex(@"^\d+\.\d+$").IsMatch(str);
      bool isChar = !(isInt || isDouble) && new Regex(@"^.$").IsMatch(str);
      bool isString = !(isInt || isDouble || isChar);
      

      【讨论】:

      • isChar 应该是新的 Regex(@"^.$");
      • 好点,虽然我没有检查之前的匹配是否失败。另外,我什至没有打电话给 IsMatch ;)
      • TryParse 方法是要走的路。您真的不希望 RegEx 用于此类事情(即使忽略速度问题)。
      • 区域设置有逗号作为小数点时会发生什么?
      • 非常感谢。但是我怎样才能包含整数的负值。?
      猜你喜欢
      • 1970-01-01
      • 2022-06-30
      • 2011-02-04
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多