Java добавляет ведущие нули к числу

Мне нужно вернуть строку в форме xxx-xxxx, где xxx — число, а xxxx — другое число, однако, когда у меня есть ведущие нули, они исчезают. Я пытаюсь форматировать числа, но это не работает.

 public String toString(){
        NumberFormat nf3 = new DecimalFormat("#000");
        NumberFormat nf4 = new DecimalFormat("#0000");
        if( areaCode != 0)
            return nf3.format(areaCode) + "-" + nf3.format(exchangeCode) + "-" + nf4.format(number);
        else
            return exchangeCode + "-" + number;
    }

}

Я понял:

 public String toString(){
        NumberFormat nf3 = new DecimalFormat("000");
        NumberFormat nf4 = new DecimalFormat("0000");
        if( areaCode != 0)
            //myFormat.format(new Integer(someValue));
            return nf3.format(new Integer(areaCode)) + "-" + nf3.format(new Integer(exchangeCode)) + "-" + nf4.format(new Integer(number));
        else
            return nf3.format(new Integer(exchangeCode)) + "-" + nf4.format(new Integer(number));
    }

person user69514    schedule 31.03.2010    source источник
comment
хех, так мой ответ не был правильным, чтобы удалить знак #? :П   -  person Holograham    schedule 31.03.2010
comment
Удаление # исправило это для меня. Мне нужен был один ведущий 0, поэтому я просто использовал (00), и это сработало.   -  person Opy    schedule 21.11.2011


Ответы (5)


Когда areaCode равен 0, вы забываете вызвать format! Кроме этого, это выглядит хорошо. Начальный «#» не обязателен, но не вызовет проблем для допустимых входных данных.

Я просто попробовал это очень быстро, чтобы проверить, и это сработало для меня нормально.

public static String formatTest(int areaCode, int exchangeCode, int number) {
    DecimalFormat nf3 = new DecimalFormat("#000");
    DecimalFormat nf4 = new DecimalFormat("#0000");
    if( areaCode != 0)
        return nf3.format(areaCode) + "-" + nf3.format(exchangeCode) + "-" + nf4.format(number);
    else
        return nf3.format(exchangeCode) + "-" + nf4.format(number);
}


public static void main(String[] args) {
    System.out.println(formatTest(12, 90, 8));
    System.out.println(formatTest(1, 953, 1932));
}

Выход:

012-090-0008
001-953-1932
person Justin Ardini    schedule 31.03.2010
comment
Без обид, но String.format — самый простой способ справиться с этим. - person ring bearer; 01.04.2010
comment
Ни один не взят. Строковый формат действительно более элегантный, но у плаката уже было решение с использованием DecimalFormat, и он просто спрашивал, почему оно не работает. - person Justin Ardini; 01.04.2010

Возможно, есть более элегантное решение:

String.format("%03d-%03d-%04d", areaCode, exchangeCode, number)
person Tomislav Nakic-Alfirevic    schedule 31.03.2010
comment
+1 намного элегантнее и лаконичнее. Другого решения не придумал. - person Yuval Adam; 01.04.2010
comment
Дерьмо. 20 лет разработчика, а я этого не знал. [этот чувак чувствует себя ооочень глупо...] Спасибо, что поделились. - person Lawrence; 01.04.2016

Удалить знак #

http://java.sun.com/docs/books/tutorial/i18n/format/decimalFormat.html

Этот код:

import java.text.DecimalFormat;
import java.text.NumberFormat;


public class Test
{

    public static void main(String[] args) 
    {       
        int areaCode = 123;
        int exchangeCode = 456;

        NumberFormat nf3 = new DecimalFormat("0000");

        System.out.println(nf3.format(areaCode) + "-" + nf3.format(exchangeCode) );
    }

}

Производит этот вывод:

0123-0456

person Holograham    schedule 31.03.2010
comment
Это не то, что он ищет. Формат не должен состоять из 2 4-значных чисел. Это формат номера телефона, ###-####. - person Justin Ardini; 31.03.2010
comment
мда, смысл был не в том, чтобы воспроизвести его проблему, а в том, чтобы показать, как добавлять ведущие нули... этот способ работает - person Holograham; 31.03.2010

Я бы рекомендовал использовать NumberFormat (http://docs.oracle.com/javase/7/docs/api/java/text/NumberFormat.html)

На мой взгляд, это дает лучшую читабельность. А также сводит к минимуму возможность ошибок, когда вы вводите неправильную строку в DecimalFormat.

  final int value1 = 1; 
  final double value2 = 4.2;

  NumberFormat nf = NumberFormat.getInstance(Locale.US);
  nf.setMinimumIntegerDigits(2);

  System.out.println(nf.format(value1));
  System.out.println(nf.format(value2));

Выход:

  01
  04.2

(Язык является необязательным, но я рекомендую его, когда вы работаете с международной командой. Значение по умолчанию — локальные настройки)

В любом случае, NumberFormat в этом смысле — отличная вещь, особенно если вам приходится иметь дело с разными странами или такими вещами, как проценты или валюта.

person Kuchi    schedule 27.09.2013

вы можете использовать класс NumberFormat и установить минимальные нули как 0, и это работает как шарм, например, для формата валюты:

   formatter = NumberFormat.getCurrencyInstance();
   formatter.setMinimumFractionDigits(0);
   -----------
   print ( formatter.format(119.00) ) ---> $119
person imansdn    schedule 25.05.2020