문제

어떻게 내가 가질까 NumberFormat.getCurrencyInstance() 마이너스 부호로 음수 USD 통화 값을 인쇄하려면?

도움이 되었습니까?

해결책 6

이 문제에 다시 직면 한 이후로, 나는 약간의 연구를했고 ICU:

NumberFormatter
  .withLocale(...)
  .unit(Currency.getInstance("USD"))
  .sign(SignDisplay.AUTO) // "123", "0", and "-123"
  .format(123)
  .toString();

API 문서를 확인하십시오 숫자 포 포터 자세한 사항은.

다른 팁

반환 된 소수판을 약간 조정해야합니다. NumberFormat.getCurrencyInstance() 로케일 독립적 인 방식으로 수행합니다. 다음은 내가 한 일입니다 (Android에서 테스트) :

DecimalFormat formatter = (DecimalFormat)NumberFormat.getCurrencyInstance();
String symbol = formatter.getCurrency().getSymbol();
formatter.setNegativePrefix(symbol+"-"); // or "-"+symbol if that's what you need
formatter.setNegativeSuffix("");

IIRC, Currency.getSymbol() 모든 시스템에 대한 모든 로케일에 대한 가치를 반환 할 수는 없지만 주요 시스템에는 효과가 있어야합니다 (그리고 자체적으로 합리적인 폴백이 있다고 생각하므로 아무것도 할 필요는 없습니다).

다음은 Java 클래스 또는 FMT : FormatNumber JSTL 태그를 통해 항상 사용하게됩니다.

DecimalFormat format = new DecimalFormat("$#,##0.00;$-#,##0.00");
String formatted = format.format(15.5);

항상 최소 $ 0.00을 생산하며 표시 될 때 일관성이 있습니다. 또한 필요한 경우 수천 명의 분리기가 포함되어 있습니다. 요건이라면 마이너스 부호를 달러 표지판 앞에서 옮길 수 있습니다.

자신만의 것을 만드는 것이 가장 좋습니다 DecimalFormat 기본값에 의존하지 않고 특정 형식을 원한다면.

편집하다: 아마도 numberformat.getCurrencyInstance ()의 결과를 시전 할 수도 있습니다. DecimalFormat 선호도에 맞게 조정하십시오.

노력하다:

NumberFormat.getCurrencyInstance(Locale.CANADA);

NumberFormat.getCurrencyInstance(Locale.UK);

POI가 Excel Currency 형식의 첫 번째 옵션을 지원하는 것을 거부하는 이유는 저를 넘어선 것입니다! enter image description here

통화 기호의 도입으로 최종 셀 값이 숫자가되지 않기 때문에 화폐에 대한 소수판을 사용하는 것을 좋아하지 않습니다. 주요 금융 기관에서 일하면서이 서식 문제를 해결해야했습니다. 이 변화의 핵심 아이디어는 POI가 합리적이지 않고 Excel의 기본 옵션을 포괄적으로 지원하기 때문에 코드에 침투하고 핵심에서 값을 변경할 것입니다. 다음은 내 해결 방법입니다.

private static final String CURRENCY_FORMAT_OVERRIDE = "\"$\"#,##0.00_);-\"$\"#,##0.00";
private static final String CURRENCY_FORMAT_TARGET = "\"$\"#,##0.00_);(\"$\"#,##0.00)";    

static { // static class level initializer
    Field field = org.apache.poi.ss.usermodel.BuiltinFormats.class.getDeclaredField("_formats");            
    field.setAccessible(true);
    String[] _formats = (String[])field.get(new org.apache.poi.ss.usermodel.BuiltinFormats());
    for(int i = 0; i < _formats.length; ++i) {
        if(_formats[i].equals(CURRENCY_FORMAT_TARGET)) {
            _formats[i]=CURRENCY_FORMAT_OVERRIDE;
            System.out.println("TAKE THAT, POI!!!");
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top