【问题标题】:Determining type of data contained in a String确定字符串中包含的数据类型
【发布时间】:2013-09-28 04:53:16
【问题描述】:

这是对 StackOverflow 中以下问题的扩展,因为我不理解接受的答案。

How do you determine the type of data contained in a string?

如果有人可以提供以下案例的示例代码:

我有一个字符串数组如下:

String[] myArray = new String[4];
 myArray[0] = "one";
 myArray[1] = "2012-02-25";
 myArray[2] = "12345.58";
 myArray[3] = "1245";

我想要的东西如下:

for(String s:myArray){

 if(s is a number){
   System.out.println("A number!");
 }

 else if(s is a float){
     System.out.println("A float!");
 }

 else if(s is a date){
     System.out.println("A date!");
 }

 else if(s is a text){
     System.out.println("A text!");
 }
}

但我不知道 IF 条件中会包含什么来确定给定字符串中的数据类型。

感谢阅读!

【问题讨论】:

  • 你考虑过使用正则表达式吗?
  • @MichaelAquilina:我可以使用正则表达式处理文本和数字。但是日期呢?
  • @NikunjChauhan 如果您的所有日期都是固定格式(即 YYYY-MM-DD),那么您也可以使用正则表达式。否则,将格式化字符串转换为日期的标准方法适用,您需要捕获任何异常。
  • AnthonyGrist 和 newuser 的建议都是可行的解决方案 ;)

标签: java string


【解决方案1】:

无法使用特定数据类型的声明来定义字符串数组。如果您需要类似的东西,请使用 List 之类的集合,例如日期对象列表。对于字符串,您必须通过分析数据以编程方式确定它,或者如果您已经知道字符串数组或字符串在程序中包含什么类型的数据,因为您是编写它的人,然后进行相应处理。

您可以创建一个自定义对象/类,它可以获取值所代表的数据的值和类型。

【讨论】:

  • “通过分析数据以编程方式确定它”——是的.. 但是如何?
  • @NikunjChauhan 您可以使用正则表达式,但如果日期可以是任何格式,例如“2013 年 9 月 23 日”、“2013 年 9 月 23 日”或“13 年 9 月 23 日”;我会使用一个自定义类,或者可能是一个带有一个属性的地图,该属性告诉我该值包含什么类型的数据。
【解决方案2】:
public static void main(String[] args) {
    String[] myArray = new String[4];
    myArray[0] = "one";
    myArray[1] = "2012-02-25";
    myArray[2] = "12345.58";
    myArray[3] = "1245";

    for(String str : myArray){
        if(str.matches("[\\d]+")){
            System.out.println(str + " is integer");
        }
        else  if(str.matches("[\\D]+")){
            System.out.println(str + " is word");
        }
        else  if(str.matches("[\\d.]+")){
            System.out.println(str + " is double");
        }
        else  if(str.matches("\\d{4}-\\d{2}-\\d{2}")){
            System.out.println(str + " is date");
        }           

    }

}

输出:

 one is word
 2012-02-25 is date
 12345.58 is double
 1245 is integer

【讨论】:

    【解决方案3】:
      for(String s:myArray){
         if(NumberUtils.isNumber(s)){          //From Apache commons
             double d= Double.valueOf(s);
             if (d==(int)d){
               System.out.println("A number!");
             }else{
               System.out.println("A Float!");
             }
         }else if(isValidDate(s)){
             System.out.println("A date!");
         }else{
             System.out.println("A text!");
         }
      }
    

    有效日期检查方法

    public static boolean isDateValid(String date) 
    {
       try {
              DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
              df.parse(date);
              return true;
       } catch (ParseException e) {
                return false;
       }
    }
    

    【讨论】:

      【解决方案4】:

      像这样写函数:

      private boolean isFloat(String str) {
          try {
              Float.parseFloat(str);
              return true;
          } catch (NumberFormatException) {
              return false;
          }
      }
      

      并检查类型。或者你可以只使用 apache commons NumberUtils

      【讨论】:

        【解决方案5】:

        一种方法是尝试解析字符串。 以下是其中一种类型的示例;

        boolean isFloat(String x) {
          try {
            Float.parseFloat(x);
          } catch (Throwable e) {
            return false;
          }
          return true;
        }
        

        注意:

        由于可以将整数解析为浮点数,因此您需要先测试它是否为整数。 所以:

        if (isInteger(s)) {
           // Integer
        else if (isFloat(s)) {
        ...
        

        【讨论】:

          【解决方案6】:

          最简单的方法是创建上述方法,然后简单地尝试解析字符串(但您必须记住,您不能 100% 告诉您某个模式是什么数据类型,可以一次多次):

          public static boolean isANumber(String s) {
              try {
                  BigDecimal d = new BigDecimal(s);
                  return true;
              } catch (Exception e) {
                  return false;
              }
          }
          
          public static boolean isAFloat(String s) {
              //same as number, unless you want is a number to 
              //check if it an integer or not
              try {
                  BigDecimal d = new BigDecimal(s);
                  return true;
              } catch (Exception e) {
                  return false;
              }
          }
          
          public static boolean isADate(String s) {
              SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
              try {
                  sdf.parse(s);
                  return true;
              } catch (Exception e) {
                  return false;
              }
          }
          
          public static boolean isAText(String s) {
              //everything could be considered a text
              // unless you want to check that characters are within some ranges
              return true;
          }
          

          【讨论】:

          • +1 只是在写同样的东西。附录:使用这些方法时,请记住测试的顺序,即在测试浮点数之前测试整数,最后测试字符串(或者将其用作默认值)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-28
          • 1970-01-01
          • 2019-06-11
          • 1970-01-01
          相关资源
          最近更新 更多