我正在使用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码扫描仪获取数据。
答案 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");