Fix small display problem when extension starts with 9
[zxing.git] / core / src / com / google / zxing / oned / UPCEANExtensionSupport.java
index f883566..15d15d3 100644 (file)
@@ -22,6 +22,7 @@ import com.google.zxing.BarcodeFormat;
 import com.google.zxing.NotFoundException;
 import com.google.zxing.Result;
 import com.google.zxing.ResultMetadataType;
+import com.google.zxing.ResultPoint;
 import com.google.zxing.common.BitArray;
 
 final class UPCEANExtensionSupport {
@@ -34,18 +35,25 @@ final class UPCEANExtensionSupport {
   private final int[] decodeMiddleCounters = new int[4];
   private final StringBuffer decodeRowStringBuffer = new StringBuffer();
 
-  Result decodeRow(BitArray row, int rowOffset) throws NotFoundException {
+  Result decodeRow(int rowNumber, BitArray row, int rowOffset) throws NotFoundException {
 
     int[] extensionStartRange = UPCEANReader.findGuardPattern(row, rowOffset, false, EXTENSION_START_PATTERN);
 
     StringBuffer result = decodeRowStringBuffer;
     result.setLength(0);
-    decodeMiddle(row, extensionStartRange, result);
+    int end = decodeMiddle(row, extensionStartRange, result);
 
     String resultString = result.toString();
     Hashtable extensionData = parseExtensionString(resultString);
 
-    Result extensionResult = new Result(resultString, null, null, BarcodeFormat.UPC_EAN_EXTENSION);
+    Result extensionResult =
+        new Result(resultString,
+                   null,
+                   new ResultPoint[] {
+                       new ResultPoint((extensionStartRange[0] + extensionStartRange[1]) / 2.0f, (float) rowNumber),
+                       new ResultPoint((float) end, (float) rowNumber),
+                   },
+                   BarcodeFormat.UPC_EAN_EXTENSION);
     if (extensionData != null) {
       extensionResult.putAllMetadata(extensionData);
     }
@@ -72,12 +80,14 @@ final class UPCEANExtensionSupport {
       if (bestMatch >= 10) {
         lgPatternFound |= 1 << (4 - x);
       }
-      // Read off separator
-      while (rowOffset < end && !row.get(rowOffset)) {
-        rowOffset++;
-      }
-      while (rowOffset < end && row.get(rowOffset)) {
-        rowOffset++;
+      if (x != 4) {
+        // Read off separator if not last
+        while (rowOffset < end && !row.get(rowOffset)) {
+          rowOffset++;
+        }
+        while (rowOffset < end && row.get(rowOffset)) {
+          rowOffset++;
+        }
       }
     }
 
@@ -150,7 +160,7 @@ final class UPCEANExtensionSupport {
   }
 
   private static String parseExtension5String(String raw) {
-    String currency = null;
+    String currency;
     switch (raw.charAt(0)) {
       case '0':
         currency = "£";
@@ -159,18 +169,28 @@ final class UPCEANExtensionSupport {
         currency = "$";
         break;
       case '9':
-        if ("99991".equals(raw)) {
+        // Reference: http://www.jollytech.com
+        if ("90000".equals(raw)) {
+          // No suggested retail price
+          return null;
+        } else if ("99991".equals(raw)) {
+          // Complementary
           return "0.00";
         } else if ("99990".equals(raw)) {
           return "Used";
         }
+        // Otherwise... unknown currency?
+        currency = "";
         break;
       default:
         currency = "";
         break;
     }
     int rawAmount = Integer.parseInt(raw.substring(1));
-    return currency + (rawAmount / 100) + '.' + (rawAmount % 100);
+    String unitsString = String.valueOf(rawAmount / 100);
+    int hundredths = rawAmount % 100;
+    String hundredthsString = hundredths < 10 ? "0" + hundredths : String.valueOf(hundredths);
+    return currency + unitsString + '.' + hundredthsString;
   }
 
 }