我有一项任务,我发现有点困难。我们正在读取外部文件以获取程序所需的数字,这不是问题。这是提示:
要检查代码的有效性,您需要分析代码中的每个数字,包括校验位。假设第一个数字位于零位,在偶数位置添加数字并将结果乘以3.将其加到奇数位数的总和。只有当总数是10的倍数时,UPC编号才有效。编写一个程序,从外部文件中读取UPC代码(作为字符串),分析代码,输出代码和标签“无效”或“有效”。
示例输出:UPC代码:
016499215511有效
372415613274无效
155512994610有效
011165459192无效
838241762110无效
到目前为止,我的代码中包含了以下内容:
import java.io.*;
import java.util.*;
public class Prog700d
{
public static void main(String[] args) throws IOException
{
Scanner kbReader = new Scanner(new File("C:\\Users\\Guest\\Documents\\java programs\\Prog700d\\Prog700d.in"));
while(kbReader.hasNextLine())
{
String upc = kbReader.nextLine();
int length = upc.length();
int a = upc.charAt(0);
System.out.println(a);
我的主要问题是charAt()。我认为如果我使用charAt(),那么我将得到给定索引处的字符。所以我决定使用charAt(0)进行测试,最后我得到了这些数字:
49 55 53 49 51
我对如何得到这些数字感到困惑,老实说不知道出了什么问题。我可以完成程序的其余部分(例如公式,打印出所有内容等),但我不知道如何解决charAt()问题。我知道我可以处理剩下的任务,但我不知道这有什么问题。如果有人可以就如何解决问题提供一些指导,我们将不胜感激。谢谢!
答案 0 :(得分:1)
这些数字是数字的UNICODE代码点。如果您需要获取数字值,请从中减去'0'
:
int a = upc.charAt(0) - '0';
System.out.println(a);
此表达式给出数字值的原因是UNICODE十进制数字代码点具有连续的整数值:'0'
为48,'1'
为49,'2'
为50,并且等等。从代码点中减去'0'
会产生数字的值。
编辑:从Java 1.5开始,您可以使用Character.digit
获取相应数字的数值:
int a = Character.digit(upc.charAt(0), 10);
System.out.println(a);
答案 1 :(得分:0)
charAt返回char类型的值。
将您的代码更改为:
String upc = kbReader.nextLine();
int length = upc.length();
char a = upc.charAt(0);
int b = Character.getNumericValue(a);
System.out.println(b);
应该那样。
答案 2 :(得分:0)
也许有点冗长,但......
% cat check.java
public class check {
public static void main(String[] arg) {
String s = arg[0];
if (s.matches("[0-9]{12}")) {
int evens = Character.digit(s.charAt(0),10) +
Character.digit(s.charAt(2),10) +
Character.digit(s.charAt(4),10) +
Character.digit(s.charAt(6),10) +
Character.digit(s.charAt(8),10) +
Character.digit(s.charAt(10),10);
int odds = Character.digit(s.charAt(1),10) +
Character.digit(s.charAt(3),10) +
Character.digit(s.charAt(5),10) +
Character.digit(s.charAt(7),10) +
Character.digit(s.charAt(9),10) +
Character.digit(s.charAt(11),10);
int sum = evens * 3 + odds;
if ((sum % 10) == 0) { System.out.println("YES"); return; }
}
System.out.println("NO");
}
}
% javac check.java
% java -classpath . check 016499215511
YES
% java -classpath . check 372415613274
NO
% java -classpath . check 37241561327
NO
% java -classpath . check 01649921551
NO
%