Add a function/some tests for string to nanocoin conversions and vice-versa, along with a TODO to clean this whole thing up. Patch from Thilo Planz.

Fixes issue 1.
This commit is contained in:
Mike Hearn 2011-04-20 15:47:41 +00:00
parent 062f87553a
commit aff7fda17d
2 changed files with 76 additions and 2 deletions

View File

@ -20,6 +20,7 @@ import com.google.bitcoin.bouncycastle.crypto.digests.RIPEMD160Digest;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@ -30,9 +31,24 @@ import java.security.NoSuchAlgorithmException;
*/
@SuppressWarnings({"SameParameterValue"})
public class Utils {
/** How many nanocoins there are in a BitCoin. */
// TODO: Replace this nanocoins business with something better.
/**
* How many "nanocoins" there are in a BitCoin.
*
* A nanocoin is the smallest unit that can be transferred using BitCoin.
* The term nanocoin is very misleading, though, because there are only 100 million
* of them in a coin (whereas one would expect 1 billion.
*/
public static final BigInteger COIN = new BigInteger("100000000", 10);
/** How many nanocoins there are in 0.01 BitCoins. */
/**
* How many "nanocoins" there are in 0.01 BitCoins.
*
* A nanocoin is the smallest unit that can be transferred using BitCoin.
* The term nanocoin is very misleading, though, because there are only 100 million
* of them in a coin (whereas one would expect 1 billion).
*/
public static final BigInteger CENT = new BigInteger("1000000", 10);
private static final boolean logging;
@ -49,6 +65,18 @@ public class Utils {
return bi;
}
/**
* Convert an amount expressed in the way humans are used to into nanocoins.<p>
*
* This takes string in a format understood by {@link BigDecimal#BigDecimal(String)},
* for example "0", "1", "0.10", "1.23E3", "1234.5E-5".
*
* @throws ArithmeticException if you try to specify fractional nanocoins
**/
public static BigInteger toNanoCoins(String coins){
return new BigDecimal(coins).movePointRight(8).toBigIntegerExact();
}
public static void uint32ToByteArrayBE(long val, byte[] out, int offset) {
out[offset + 0] = (byte) (0xFF & (val >> 24));
out[offset + 1] = (byte) (0xFF & (val >> 16));

View File

@ -0,0 +1,46 @@
/**
* Copyright 2011 Thilo Planz
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.bitcoin.core;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.fail;
import org.junit.Test;
public class UtilsTest {
@Test
public void testToNanoCoins() {
// String version
assertEquals(Utils.CENT, Utils.toNanoCoins("0.01"));
assertEquals(Utils.CENT, Utils.toNanoCoins("1E-2"));
assertEquals(Utils.COIN.add(Utils.CENT), Utils.toNanoCoins("1.01"));
try {
Utils.toNanoCoins("2E-20");
fail("should not have accepted fractional nanocoins");
} catch (ArithmeticException e) {
}
// int version
assertEquals(Utils.CENT, Utils.toNanoCoins(0, 1));
// TODO: should this really pass?
assertEquals(Utils.COIN.subtract(Utils.CENT), Utils.toNanoCoins(1, -1));
assertEquals(Utils.COIN.negate(), Utils.toNanoCoins(-1, 0));
assertEquals(Utils.COIN.negate(), Utils.toNanoCoins("-1"));
}
}