L
Sogar, wenn man die Vor- und Nachkommastellen auf 9 begrenzt, kommt man dabei auf keinen grünen Zweig:
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class NumbersToolTest {
@Test
void formatNumber_0_exceptions() {
assertThrows(IllegalArgumentException.class, () -> NumbersTool.formatNumber(123.12, -1, ','));
assertThrows(IllegalArgumentException.class, () -> NumbersTool.formatNumber(123.12, 0, ','));
assertThrows(IllegalArgumentException.class, () -> NumbersTool.formatNumber(123.12, 10, ','));
assertThrows(IllegalArgumentException.class, () -> NumbersTool.formatNumber(123.12, 11, ','));
assertThrows(
IllegalArgumentException.class,
() -> NumbersTool.formatNumber(Math.nextDown(-1e10), 2, ','));
assertThrows(IllegalArgumentException.class, () -> NumbersTool.formatNumber(-1e10, 2, ','));
assertThrows(IllegalArgumentException.class, () -> NumbersTool.formatNumber(1e10, 2, ','));
assertThrows(
IllegalArgumentException.class, () -> NumbersTool.formatNumber(Math.nextUp(1e10), 2, ','));
}
@Test
void formatNumber_1_shortNumbers() {
double n1 = 123.12;
String s1 = "123,120000000";
for (int i = 1; i <= 9; i++) {
assertEquals(s1.substring(0, 4 + i), NumbersTool.formatNumber(n1, i, ','));
}
double n2 = 123;
for (int i = 1; i <= 9; i++) {
assertEquals("123," + "0".repeat(i), NumbersTool.formatNumber(n2, i, ','));
}
double n3 = -1;
for (int i = 1; i <= 9; i++) {
assertEquals("-1," + "0".repeat(i), NumbersTool.formatNumber(n3, i, ','));
}
double n4 = 1;
for (int i = 1; i <= 9; i++) {
assertEquals("1," + "0".repeat(i), NumbersTool.formatNumber(n4, i, ','));
}
double n5 = -0.5;
String s5 = "-0,500000000";
for (int i = 1; i <= 9; i++) {
assertEquals(s5.substring(0, 3 + i), NumbersTool.formatNumber(n5, i, ','));
}
double n6 = 0.5;
String s6 = "0,500000000";
for (int i = 1; i <= 9; i++) {
assertEquals(s6.substring(0, 2 + i), NumbersTool.formatNumber(n6, i, ','));
}
}
@Test
void formatNumber_2_longNumber() {
double n = Math.PI;
String s = "3,14159265358979323846";
for (int i = 1; i <= 9; i++) {
assertEquals(s.substring(0, 2 + i), NumbersTool.formatNumber(n, i, ','));
}
}
@Test
void formatNumber_3_negativeNumber() {
double n = -1.9911;
String s = "-1,991100000";
for (int i = 1; i <= 9; i++) {
assertEquals(s.substring(0, 3 + i), NumbersTool.formatNumber(n, i, ','));
}
}
@Test
void formatNumber_4_zero() {
double n = 0;
for (int i = 1; i <= 9; i++) {
assertEquals("0," + "0".repeat(i), NumbersTool.formatNumber(n, i, ','));
}
}
@Test
void formatNumber_5_edgeCaseLargeDecimalPlaces() {
double n = 1.0 / 3.0; // 0.3333333333333333...
for (int i = 1; i <= 9; i++) {
assertEquals("0," + "3".repeat(i), NumbersTool.formatNumber(n, i, ','));
}
}
@Test
void formatNumber_6_edgeCaseVerySmallNumber() {
double n1 = 0.000000001;
for (int i = 1; i <= 8; i++) {
assertEquals("0," + "0".repeat(i), NumbersTool.formatNumber(n1, i, ','));
}
assertEquals("0,000000001", NumbersTool.formatNumber(n1, 9, ','));
double n2 = -0.000000001;
for (int i = 1; i <= 8; i++) {
assertEquals("0," + "0".repeat(i), NumbersTool.formatNumber(n2, i, ','));
}
assertEquals("-0,000000001", NumbersTool.formatNumber(n2, 9, ','));
double n3 = 0.00000000111;
for (int i = 1; i <= 8; i++) {
assertEquals("0," + "0".repeat(i), NumbersTool.formatNumber(n3, i, ','));
}
assertEquals("0,000000001", NumbersTool.formatNumber(n3, 9, ','));
double n4 = -0.00000000111;
for (int i = 1; i <= 8; i++) {
assertEquals("0," + "0".repeat(i), NumbersTool.formatNumber(n4, i, ','));
}
assertEquals("-0,000000001", NumbersTool.formatNumber(n4, 9, ','));
double n5 = 0.99999999999;
for (int i = 1; i <= 9; i++) {
assertEquals("0," + "9".repeat(i), NumbersTool.formatNumber(n5, i, ','));
}
double n6 = -0.99999999999;
for (int i = 1; i <= 9; i++) {
assertEquals("-0," + "9".repeat(i), NumbersTool.formatNumber(n6, i, ','));
}
double n7 = 0.99999999999999;
for (int i = 1; i <= 9; i++) {
assertEquals("0," + "9".repeat(i), NumbersTool.formatNumber(n7, i, ','));
}
double n8 = -0.99999999999999;
for (int i = 1; i <= 9; i++) {
assertEquals("-0," + "9".repeat(i), NumbersTool.formatNumber(n8, i, ','));
}
}
@Test
void formatNumber_7_edgeCaseRounding() {
double n = 2.675; // known floating point issue
String s = "2,675000000";
for (int i = 1; i <= 9; i++) {
// will fail at i >= 8
assertEquals(s.substring(0, 2 + i), NumbersTool.formatNumber(n, i, ','));
}
double n2 = -2.675; // known floating point issue
String s2 = "-2,675000000";
for (int i = 1; i <= 9; i++) {
// will fail at i >= 8
assertEquals(s2.substring(0, 3 + i), NumbersTool.formatNumber(n2, i, ','));
}
}
@Test
void formatNumber_8_edgeCaseBigNumbers() {
double n1 = 999999999.0; // 9 nines before decimal point
for (int i = 1; i <= 9; i++) {
// will fail at 8 and 9 decimal places
assertEquals("999999999," + "0".repeat(i), NumbersTool.formatNumber(n1, i, ','));
}
double n2 = -999999999.0; // 9 nines before decimal point
for (int i = 1; i <= 9; i++) {
// will fail at 8 and 9 decimal places
assertEquals("-999999999," + "0".repeat(i), NumbersTool.formatNumber(n2, i, ','));
}
double n3 = 999999999.999999999; // 9 nines before decimal point, 9 nines after decimal point
for (int i = 1; i <= 9; i++) {
// will fail immediately at i >= 1
assertEquals("999999999," + "9".repeat(i), NumbersTool.formatNumber(n3, i, ','));
}
}
}
Test 7 und 8 werden immer failen.
Aber man kann in C-Sharp ja einfach Math.Round verwenden: https://stackoverflow.com/questions/257005/how-do-you-round-a-number-to-two-decimal-places
auch wenn ich nicht sicher bin, ob das auch mit 0en auffüllt - oder nur rundet. (/monolog-ende)