QR码扫描仪-空格字符问题

时间:2019-01-06 15:18:47

标签: java android qr-code

我正在使用zxing库制作药品有效期提醒项目。我正在使用qr代码,尝试获取空格字符后的到期日期并将其转换为日期格式。例如qr代码=“ 010869971701010921104197131 1722022810170666”>(17)220228> yyMMdd到ddMMyyyy>结果:28.02.2022

public void handleResult(Result result) {
      String resultCode = result.getText();

      String[] date1 = resultCode.split("\\s");   
      String s = date1[1].substring(2,8);

      SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
      try {           
        Date d1 = sdf.parse(s);;
        sdf.applyPattern("dd.MM.yyyy");
        MainActivity.date.setText(sdf.format(d1));
      }catch(ParseException e) {
        e.printStackTrace();
      }

此代码使应用崩溃。如果我手动将值赋给resultCode,则应用程序正在运行。例如resultCode =“ 010869971701010921104197131 1722022810170666”> 28.02.2022

我注意到问题出在这一行:String [] date1 = resultCode.split(“ \ s”);

然后我尝试替换所有空格字符([android splitting with space not working for this case. Why?):

resultCode = resultCode.replaceAll("\\t", "a");
resultCode = resultCode.replaceAll("\\xA0", "b");
resultCode = resultCode.replaceAll("\\u1680", "c");
resultCode = resultCode.replaceAll("\\u180e", "d");
resultCode = resultCode.replaceAll("\\u2000", "e");
resultCode = resultCode.replaceAll("\\u200a", "f");
resultCode = resultCode.replaceAll("\\u202f", "g");
resultCode = resultCode.replaceAll("\\u205f", "h");
resultCode = resultCode.replaceAll("\\u3000", "i");
>>>resultCode = resultCode.replaceAll("(^\\h*)|(\\h*$)","j");
resultCode = resultCode.replaceAll("\\u00A0","k");
resultCode = resultCode.replaceAll("\\u2007","l");

结果:“ j010869971701010921104197131 1722022810170666j”

仅处理我用“ >>>”标记的行。那不是空格字符吗?可能是什么问题?如何获得空白和“ 17”之后的有效期?

  

尽管我将resultCode定义为字符串,但其类型可能是   不一样?

String resultCode = result.getText();
     

resultCode直接从QR码扫描仪获取数据。

1 个答案:

答案 0 :(得分:0)

我认为您不需要替换空白。

您的问题是,您标记的行适用于Java 8,而android当前仅部分支持该行。

resultCode = resultCode.replaceAll("(^\\h*)|(\\h*$)","j");

在您的情况下,它被解释为“在开头和结尾将每个(0个或多个)'h'字符替换为'j'”(旧的Java 7方式)。

要获得所需的零件,请尝试使用resultCode.split("\\s17")。它将把字符串分成“ 17”之前和之后的部分。然后,您可以简单地解析第二个数组条目,即您的日期。

您的工作代码应如下所示:

public void handleResult(Result result) {
    String resultCode = result.getText();

    String[] date1 = resultCode.split("\\s17");

    SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
    try {           
        Date d1 = sdf.parse(date1[1]);
        sdf.applyPattern("dd.MM.yyyy");
        MainActivity.date.setText(sdf.format(d1));
    }catch(ParseException e) {
        e.printStackTrace();
    }
}

此外,此块不会删除您的空格,而是将其替换为字符a,b,c,...。只需删除它,就不需要它。

resultCode = resultCode.replaceAll("\\t", "a");
resultCode = resultCode.replaceAll("\\xA0", "b");
resultCode = resultCode.replaceAll("\\u1680", "c");
resultCode = resultCode.replaceAll("\\u180e", "d");
resultCode = resultCode.replaceAll("\\u2000", "e");
resultCode = resultCode.replaceAll("\\u200a", "f");
resultCode = resultCode.replaceAll("\\u202f", "g");
resultCode = resultCode.replaceAll("\\u205f", "h");
resultCode = resultCode.replaceAll("\\u3000", "i");