有人可以帮我修复这个toString方法请

问题描述:

我有一个方法将字符串转换为MeterNumber。代码如下。有人可以帮我修复这个toString方法请

public static MeterNumber fromString(String number) { 
     MeterNumber mn = new MeterNumber(false); 
     int i = 0, // position in number 
      n = 0, // number of digits 
      len = number.length(); 
     boolean valid = true; 
     while (valid && i < len) { 
     char c = number.charAt(i); 
     i = i + 1; 
     if (n < 9 && Character.isDigit(c)) { 
      mn.digits[n] = c - '0'; 
      n = n + 1; 
     } else if (Character.isWhitespace(c)) { 
      // skip spaces 
     } else { 
      valid = false; 
     } 
     } 
     int cs = mn.checksum(); 
     if (valid && i == len && n == 9 && 
      cs/10 == mn.digits[7] && cs % 10 == mn.digits[8]) { 
     return mn; 
     } else { 
     return null; 
     } 
    } 

它想读这样的输入:

531 481 889 O 788.5 
652 364 795 P 2442.7 

它会正常工作,如果我只是提供:

531 481 889 
652 364 795 

但是它返回null如果我输入的是这种格式:

531 481 889 O 788.5 
652 364 795 P 2442.7 

你可以请他我看到了这个问题。为什么Char和Double在行结尾干扰?

这是调用该方法的代码。

private MeterNumber meterNumber; 


public static Meter load(Scanner sc) { 
     MeterNumber meterNumber = MeterNumber.fromString(sc.nextLine()); 
     int n = 1; 
     sc.nextLine(); 
     Tariff[] tariffs = new Tariff[n]; 
     for (int i = 0; i < n; i++) { 
     String kind = sc.next(); 
     sc.nextLine(); 
     if (kind.equals("P")) { 
      tariffs[i] = PeakTariff.PEAK_TARIFF; 
     } else if (kind.equals("O")) { 
      tariffs[i] = OffPeakTariff.OFF_PEAK_TARIFF; 
     } 
     } 
     return new Meter(meterNumber, tariffs); 
    } 

public MeterNumber getMeterNumber() { 
     return meterNumber; 
    } 

} 

这是代码从我的主要方法调用:

Scanner sc2 = new Scanner(new java.io.File("Readings.txt")); 
     Meter meter = Meter.load(sc2); 

     System.out.println(meter.getMeterNumber()); 

在此先感谢。

+0

什么是“MeterNumber”? – 2014-11-04 05:10:59

+0

这是一个九位数字 – lolian 2014-11-04 05:12:05

+0

您需要提供可运行代码。所以你需要向我们展示代码'MeterNumber' – 2014-11-04 05:12:33

它返回null,因为你说它是无效的。

while (valid && i < len) { 
    char c = number.charAt(i); 
    i = i + 1; 
    if (n < 9 && Character.isDigit(c)) { 
     mn.digits[n] = c - '0'; 
     n = n + 1; 
    } else if (Character.isWhitespace(c)) { 
     // skip spaces 
    } else { //this else is the problem 
     valid = false; 
    } 
    } 

你告诉它设置valid如果它既不是空格也不是数字。由于O和P不是数字或空格,它将有效设置为false。

if (valid && i == len && n == 9 && 
     cs/10 == mn.digits[7] && cs % 10 == mn.digits[8]) { 
    return mn; 
    } else { 
    return null; 
    } 

if语句检查的第一件事是它是否有效。由于它不是,它返回null。