SORU
20 Ocak 2011, PERŞEMBE


Nasıl java 1.2 k 1200 biçimlendirme için

Java ile sayılar, bunların yanında aşağıdaki sayı biçimi etmek istiyorum:

1000 to 1k
5821 to 5.8k
10500 to 10k
101800 to 101k
2000000 to 2m
7800000 to 7.8m
92150000 to 92m
123200000 to 123m

Sağdaki sayıyı soldaki sayı, dize olacak uzun ya da tamsayı olur. Bu nasıl bir yaklaşım gerekiyor. Ben zaten küçük bir algoritma bu. ama ben öyle bir ihtimal var ama zaten bir şeyler icat var mı daha güzel iş ve gerektirmez ek testler eğer ben başlamak ile ilgili milyarlarca ve milyarlarca :)

Ek Gereksinimler:

  • Biçim 4 karakter olmalıdır
  • Yukarıda anlamı 1.1 k k değil TAMAM 11.2. 7.8 için aynı m OK 19.1 m değildir. Ondalık noktasından önce sadece bir rakam, ondalık noktası için izin verilir. Ondalık noktasından önce iki basamaklı virgülden sonraki basamak anlamına gelir.
  • Yuvarlama gereklidir. (Sayı k ve m ile gösterilen eklenmiş analog ölçer yaklaşım değil kesin mantık makale gösteren daha fazla. Dolayısıyla yuvarlama önbelleğe alınan sonuca bakarak bile artırabilir daha değişken ağırlıklı yapısı nedeniyle ilgisizdir ya da birkaç basamak Kararname.)

CEVAP
20 Ocak 2011, PERŞEMBE


Ben, bu daha C bir program gibi görünüyor, ama çok hafif!

public static void main(String args[]) {
    long[] numbers = new long[]{1000, 5821, 10500, 101800, 2000000, 7800000, 92150000, 123200000, 9999999};
    for(long n : numbers) {
        System.out.println(n   " => "   coolFormat(n, 0));
    }
}

private static char[] c = new char[]{'k', 'm', 'b', 't'};

/**
 * Recursive implementation, invokes itself for each factor of a thousand, increasing the class on each invokation.
 * @param n the number to format
 * @param iteration in fact this is the class from the array c
 * @return a String representing the number n formatted in a cool looking way.
 */
private static String coolFormat(double n, int iteration) {
    double d = ((long) n / 100) / 10.0;
    boolean isRound = (d * 10)  == 0;//true if the decimal part is equal to 0 (then it's trimmed anyway)
    return (d < 1000? //this determines the class, i.e. 'k', 'm' etc
        ((d > 99.9 || isRound || (!isRound && d > 9.99)? //this decides whether to trim the decimals
         (int) d * 10 / 10 : d   "" // (int) d * 10 / 10 drops the decimal
         )   ""   c[iteration]) 
        : coolFormat(d, iteration 1));

}

Çıktılar:

1000 => 1k
5821 => 5.8k
10500 => 10k
101800 => 101k
2000000 => 2m
7800000 => 7.8m
92150000 => 92m
123200000 => 123m
9999999 => 9.9m

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EmperorTigerstar

    EmperorTiger

    14 EYLÜL 2009
  • Google Россия

    Google Ро

    9 Temmuz 2007
  • segtlim

    segtlim

    21 EKİM 2008