@ solusion đệ quy của (Câu trả lời được chấp nhận) là 100% đúng. Tôi chỉ cần thêm một mã mẫu để bạn tham khảo.
Trường hợp của tôi là hiển thị giá với hai chữ số thập phân.Đây là một phần của phản hồi back-end: "price": 2300, "currencySymbol": "CD", ...
.
Đây là lớp helper của tôi:
public class CurrencyUtils
{
private static final String[] suffix = { "", "K", "M" };
public static String getCompactStringForDisplay(final int amount)
{
int suffixIndex;
if (amount >= 1_000_000) {
suffixIndex = 2;
} else if (amount >= 1_000) {
suffixIndex = 1;
} else {
suffixIndex = 0;
}
int quotient;
int remainder;
if (amount >= 1_000_000) {
quotient = amount/1_000_000;
remainder = amount % 1_000_000;
} else if (amount >= 1_000) {
quotient = amount/1_000;
remainder = amount % 1_000;
} else {
return String.valueOf(amount);
}
if (remainder == 0) {
return String.valueOf(quotient) + suffix[suffixIndex];
}
// Keep two most significant digits
if (remainder >= 10_000) {
remainder /= 10_000;
} else if (remainder >= 1_000) {
remainder /= 1_000;
} else if (remainder >= 100) {
remainder /= 10;
}
return String.valueOf(quotient) + '.' + String.valueOf(remainder) + suffix[suffixIndex];
}
}
Đây là lớp học của tôi thử nghiệm (dựa trên JUnit 4):
public class CurrencyUtilsTest {
@Test
public void getCompactStringForDisplay() throws Exception {
int[] numbers = {0, 5, 999, 1_000, 5_821, 10_500, 101_800, 2_000_000, 7_800_000, 92_150_000, 123_200_000, 9_999_999};
String[] expected = {"0", "5", "999", "1K", "5.82K", "10.50K", "101.80K", "2M", "7.80M", "92.15M", "123.20M", "9.99M"};
for (int i = 0; i < numbers.length; i++) {
int n = numbers[i];
String formatted = CurrencyUtils.getCompactStringForDisplay(n);
System.out.println(n + " => " + formatted);
assertEquals(expected[i], formatted);
}
}
}
trong Java nó sẽ không làm việc, nếu bạn làm 1,0% 0,1 – endless
@endless: Đúng, bạn phải chuyển đổi thành số nguyên đầu tiên. Và bạn cũng phải xác định ý nghĩa của phần còn lại của hai phao, vì nó thường được định nghĩa dưới dạng số học số nguyên. – recursive
Nếu ai đó đi qua câu hỏi này và tự hỏi làm thế nào bạn sẽ không nhận được thương, nhưng số tự nhiên lớn nhất <= thương hoặc mod bạn có thể sử dụng hàm trong gói toán học: 'Math.floorDiv (x, y)' và 'Math.floorMod (x, y)' –