mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-11-02 21:47:18 +00:00
Rename Coin.toNanoCoin(String) to Coin.parseCoin(String).
This commit is contained in:
committed by
Mike Hearn
parent
3e846901cb
commit
49adaeed16
@@ -62,6 +62,23 @@ public final class Coin implements Comparable<Coin>, Serializable {
|
|||||||
return new Coin(satoshis);
|
return new Coin(satoshis);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses an amount expressed in the way humans are used to.<p>
|
||||||
|
* <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 satoshis, or a value out of range.
|
||||||
|
*/
|
||||||
|
public static Coin parseCoin(final String str) {
|
||||||
|
Coin coin = Coin.valueOf(new BigDecimal(str).movePointRight(8).toBigIntegerExact().longValue());
|
||||||
|
if (coin.signum() < 0)
|
||||||
|
throw new ArithmeticException("Negative coins specified");
|
||||||
|
if (coin.compareTo(NetworkParameters.MAX_MONEY) > 0)
|
||||||
|
throw new ArithmeticException("Amount larger than the total quantity of Bitcoins possible specified.");
|
||||||
|
return coin;
|
||||||
|
}
|
||||||
|
|
||||||
public Coin add(final Coin value) {
|
public Coin add(final Coin value) {
|
||||||
return new Coin(LongMath.checkedAdd(this.value, value.value));
|
return new Coin(LongMath.checkedAdd(this.value, value.value));
|
||||||
}
|
}
|
||||||
@@ -108,23 +125,6 @@ public final class Coin implements Comparable<Coin>, Serializable {
|
|||||||
return this.value;
|
return this.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert an amount expressed in the way humans are used to into nanocoins.<p>
|
|
||||||
* <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, or nanocoins out of range.
|
|
||||||
*/
|
|
||||||
public static Coin toNanoCoins(String coins) {
|
|
||||||
Coin bigint = Coin.valueOf(new BigDecimal(coins).movePointRight(8).toBigIntegerExact().longValue());
|
|
||||||
if (bigint.signum() < 0)
|
|
||||||
throw new ArithmeticException("Negative coins specified");
|
|
||||||
if (bigint.compareTo(NetworkParameters.MAX_MONEY) > 0)
|
|
||||||
throw new ArithmeticException("Amount larger than the total quantity of Bitcoins possible specified.");
|
|
||||||
return bigint;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert an amount expressed in the way humans are used to into nanocoins.
|
* Convert an amount expressed in the way humans are used to into nanocoins.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ public class BitcoinURI {
|
|||||||
if (FIELD_AMOUNT.equals(nameToken)) {
|
if (FIELD_AMOUNT.equals(nameToken)) {
|
||||||
// Decode the amount (contains an optional decimal component to 8dp).
|
// Decode the amount (contains an optional decimal component to 8dp).
|
||||||
try {
|
try {
|
||||||
Coin amount = Coin.toNanoCoins(valueToken);
|
Coin amount = Coin.parseCoin(valueToken);
|
||||||
putWithValidation(FIELD_AMOUNT, amount);
|
putWithValidation(FIELD_AMOUNT, amount);
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
throw new OptionalFieldValidationException(String.format("'%s' is not a valid amount", valueToken), e);
|
throw new OptionalFieldValidationException(String.format("'%s' is not a valid amount", valueToken), e);
|
||||||
|
|||||||
@@ -26,13 +26,13 @@ import org.junit.Test;
|
|||||||
public class CoinTest {
|
public class CoinTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testToNanoCoins() {
|
public void testParseCoin() {
|
||||||
// String version
|
// String version
|
||||||
assertEquals(CENT, toNanoCoins("0.01"));
|
assertEquals(CENT, parseCoin("0.01"));
|
||||||
assertEquals(CENT, toNanoCoins("1E-2"));
|
assertEquals(CENT, parseCoin("1E-2"));
|
||||||
assertEquals(COIN.add(CENT), toNanoCoins("1.01"));
|
assertEquals(COIN.add(CENT), parseCoin("1.01"));
|
||||||
try {
|
try {
|
||||||
toNanoCoins("2E-20");
|
parseCoin("2E-20");
|
||||||
org.junit.Assert.fail("should not have accepted fractional nanocoins");
|
org.junit.Assert.fail("should not have accepted fractional nanocoins");
|
||||||
} catch (ArithmeticException e) {
|
} catch (ArithmeticException e) {
|
||||||
}
|
}
|
||||||
@@ -49,7 +49,7 @@ public class CoinTest {
|
|||||||
fail();
|
fail();
|
||||||
} catch (IllegalArgumentException e) {}
|
} catch (IllegalArgumentException e) {}
|
||||||
try {
|
try {
|
||||||
toNanoCoins("-1");
|
parseCoin("-1");
|
||||||
fail();
|
fail();
|
||||||
} catch (ArithmeticException e) {}
|
} catch (ArithmeticException e) {}
|
||||||
}
|
}
|
||||||
@@ -68,29 +68,29 @@ public class CoinTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testToPlainString() {
|
public void testToPlainString() {
|
||||||
assertEquals("0.0015", Coin.valueOf(150000).toPlainString());
|
assertEquals("0.0015", Coin.valueOf(150000).toPlainString());
|
||||||
assertEquals("1.23", toNanoCoins("1.23").toPlainString());
|
assertEquals("1.23", parseCoin("1.23").toPlainString());
|
||||||
|
|
||||||
assertEquals("0.1", toNanoCoins("0.1").toPlainString());
|
assertEquals("0.1", parseCoin("0.1").toPlainString());
|
||||||
assertEquals("1.1", toNanoCoins("1.1").toPlainString());
|
assertEquals("1.1", parseCoin("1.1").toPlainString());
|
||||||
assertEquals("21.12", toNanoCoins("21.12").toPlainString());
|
assertEquals("21.12", parseCoin("21.12").toPlainString());
|
||||||
assertEquals("321.123", toNanoCoins("321.123").toPlainString());
|
assertEquals("321.123", parseCoin("321.123").toPlainString());
|
||||||
assertEquals("4321.1234", toNanoCoins("4321.1234").toPlainString());
|
assertEquals("4321.1234", parseCoin("4321.1234").toPlainString());
|
||||||
assertEquals("54321.12345", toNanoCoins("54321.12345").toPlainString());
|
assertEquals("54321.12345", parseCoin("54321.12345").toPlainString());
|
||||||
assertEquals("654321.123456", toNanoCoins("654321.123456").toPlainString());
|
assertEquals("654321.123456", parseCoin("654321.123456").toPlainString());
|
||||||
assertEquals("7654321.1234567", toNanoCoins("7654321.1234567").toPlainString());
|
assertEquals("7654321.1234567", parseCoin("7654321.1234567").toPlainString());
|
||||||
try {
|
try {
|
||||||
assertEquals("87654321.12345678", toNanoCoins("87654321.12345678").toPlainString());
|
assertEquals("87654321.12345678", parseCoin("87654321.12345678").toPlainString());
|
||||||
Assert.fail(); // More than MAX_MONEY
|
Assert.fail(); // More than MAX_MONEY
|
||||||
} catch (Exception e) {}
|
} catch (Exception e) {}
|
||||||
|
|
||||||
// check there are no trailing zeros
|
// check there are no trailing zeros
|
||||||
assertEquals("1", toNanoCoins("1.0").toPlainString());
|
assertEquals("1", parseCoin("1.0").toPlainString());
|
||||||
assertEquals("2", toNanoCoins("2.00").toPlainString());
|
assertEquals("2", parseCoin("2.00").toPlainString());
|
||||||
assertEquals("3", toNanoCoins("3.000").toPlainString());
|
assertEquals("3", parseCoin("3.000").toPlainString());
|
||||||
assertEquals("4", toNanoCoins("4.0000").toPlainString());
|
assertEquals("4", parseCoin("4.0000").toPlainString());
|
||||||
assertEquals("5", toNanoCoins("5.00000").toPlainString());
|
assertEquals("5", parseCoin("5.00000").toPlainString());
|
||||||
assertEquals("6", toNanoCoins("6.000000").toPlainString());
|
assertEquals("6", parseCoin("6.000000").toPlainString());
|
||||||
assertEquals("7", toNanoCoins("7.0000000").toPlainString());
|
assertEquals("7", parseCoin("7.0000000").toPlainString());
|
||||||
assertEquals("8", toNanoCoins("8.00000000").toPlainString());
|
assertEquals("8", parseCoin("8.00000000").toPlainString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import org.junit.Test;
|
|||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
|
||||||
import static com.google.bitcoin.core.Coin.toNanoCoins;
|
import static com.google.bitcoin.core.Coin.*;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
public class BitcoinURITest {
|
public class BitcoinURITest {
|
||||||
@@ -38,25 +38,25 @@ public class BitcoinURITest {
|
|||||||
Address goodAddress = new Address(MainNetParams.get(), MAINNET_GOOD_ADDRESS);
|
Address goodAddress = new Address(MainNetParams.get(), MAINNET_GOOD_ADDRESS);
|
||||||
|
|
||||||
// simple example
|
// simple example
|
||||||
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=12.34&label=Hello&message=AMessage", BitcoinURI.convertToBitcoinURI(goodAddress, toNanoCoins("12.34"), "Hello", "AMessage"));
|
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=12.34&label=Hello&message=AMessage", BitcoinURI.convertToBitcoinURI(goodAddress, parseCoin("12.34"), "Hello", "AMessage"));
|
||||||
|
|
||||||
// example with spaces, ampersand and plus
|
// example with spaces, ampersand and plus
|
||||||
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=12.34&label=Hello%20World&message=Mess%20%26%20age%20%2B%20hope", BitcoinURI.convertToBitcoinURI(goodAddress, toNanoCoins("12.34"), "Hello World", "Mess & age + hope"));
|
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=12.34&label=Hello%20World&message=Mess%20%26%20age%20%2B%20hope", BitcoinURI.convertToBitcoinURI(goodAddress, parseCoin("12.34"), "Hello World", "Mess & age + hope"));
|
||||||
|
|
||||||
// no amount, label present, message present
|
// no amount, label present, message present
|
||||||
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?label=Hello&message=glory", BitcoinURI.convertToBitcoinURI(goodAddress, null, "Hello", "glory"));
|
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?label=Hello&message=glory", BitcoinURI.convertToBitcoinURI(goodAddress, null, "Hello", "glory"));
|
||||||
|
|
||||||
// amount present, no label, message present
|
// amount present, no label, message present
|
||||||
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=0.1&message=glory", BitcoinURI.convertToBitcoinURI(goodAddress, toNanoCoins("0.1"), null, "glory"));
|
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=0.1&message=glory", BitcoinURI.convertToBitcoinURI(goodAddress, parseCoin("0.1"), null, "glory"));
|
||||||
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=0.1&message=glory", BitcoinURI.convertToBitcoinURI(goodAddress, toNanoCoins("0.1"), "", "glory"));
|
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=0.1&message=glory", BitcoinURI.convertToBitcoinURI(goodAddress, parseCoin("0.1"), "", "glory"));
|
||||||
|
|
||||||
// amount present, label present, no message
|
// amount present, label present, no message
|
||||||
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=12.34&label=Hello", BitcoinURI.convertToBitcoinURI(goodAddress, toNanoCoins("12.34"), "Hello", null));
|
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=12.34&label=Hello", BitcoinURI.convertToBitcoinURI(goodAddress, parseCoin("12.34"), "Hello", null));
|
||||||
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=12.34&label=Hello", BitcoinURI.convertToBitcoinURI(goodAddress, toNanoCoins("12.34"), "Hello", ""));
|
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=12.34&label=Hello", BitcoinURI.convertToBitcoinURI(goodAddress, parseCoin("12.34"), "Hello", ""));
|
||||||
|
|
||||||
// amount present, no label, no message
|
// amount present, no label, no message
|
||||||
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=1000", BitcoinURI.convertToBitcoinURI(goodAddress, toNanoCoins("1000"), null, null));
|
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=1000", BitcoinURI.convertToBitcoinURI(goodAddress, parseCoin("1000"), null, null));
|
||||||
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=1000", BitcoinURI.convertToBitcoinURI(goodAddress, toNanoCoins("1000"), "", ""));
|
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?amount=1000", BitcoinURI.convertToBitcoinURI(goodAddress, parseCoin("1000"), "", ""));
|
||||||
|
|
||||||
// no amount, label present, no message
|
// no amount, label present, no message
|
||||||
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?label=Hello", BitcoinURI.convertToBitcoinURI(goodAddress, null, "Hello", null));
|
assertEquals("bitcoin:" + MAINNET_GOOD_ADDRESS + "?label=Hello", BitcoinURI.convertToBitcoinURI(goodAddress, null, "Hello", null));
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ import java.util.concurrent.TimeoutException;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.LogManager;
|
import java.util.logging.LogManager;
|
||||||
|
|
||||||
import static com.google.bitcoin.core.Coin.toNanoCoins;
|
import static com.google.bitcoin.core.Coin.parseCoin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A command line tool for manipulating wallets and working with Bitcoin.
|
* A command line tool for manipulating wallets and working with Bitcoin.
|
||||||
@@ -128,7 +128,7 @@ public class WalletTool {
|
|||||||
|
|
||||||
public boolean matchBitcoins(Coin comparison) {
|
public boolean matchBitcoins(Coin comparison) {
|
||||||
try {
|
try {
|
||||||
Coin units = toNanoCoins(value);
|
Coin units = parseCoin(value);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case LT: return comparison.compareTo(units) < 0;
|
case LT: return comparison.compareTo(units) < 0;
|
||||||
case GT: return comparison.compareTo(units) > 0;
|
case GT: return comparison.compareTo(units) > 0;
|
||||||
@@ -327,7 +327,7 @@ public class WalletTool {
|
|||||||
} else if (options.has(outputFlag)) {
|
} else if (options.has(outputFlag)) {
|
||||||
Coin fee = Coin.ZERO;
|
Coin fee = Coin.ZERO;
|
||||||
if (options.has("fee")) {
|
if (options.has("fee")) {
|
||||||
fee = toNanoCoins((String)options.valueOf("fee"));
|
fee = parseCoin((String)options.valueOf("fee"));
|
||||||
}
|
}
|
||||||
String lockTime = null;
|
String lockTime = null;
|
||||||
if (options.has("locktime")) {
|
if (options.has("locktime")) {
|
||||||
@@ -427,7 +427,7 @@ public class WalletTool {
|
|||||||
}
|
}
|
||||||
String destination = parts[0];
|
String destination = parts[0];
|
||||||
try {
|
try {
|
||||||
Coin value = toNanoCoins(parts[1]);
|
Coin value = parseCoin(parts[1]);
|
||||||
if (destination.startsWith("0")) {
|
if (destination.startsWith("0")) {
|
||||||
// Treat as a raw public key.
|
// Treat as a raw public key.
|
||||||
byte[] pubKey = new BigInteger(destination, 16).toByteArray();
|
byte[] pubKey = new BigInteger(destination, 16).toByteArray();
|
||||||
|
|||||||
Reference in New Issue
Block a user