NumberFormatter가 마이너스 부호로 음수 통화 값을 인쇄하도록하려면 어떻게해야합니까?
-
18-09-2019 - |
문제
PHP를 사용하고 있습니다 숫자 포 포터 통화 값을 인쇄하는 클래스.
예 :
$cFormatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
$cFormatter->formatCurrency(123, 'USD');
$cFormatter->formatCurrency(123, 'BRL');
$cFormatter->formatCurrency(123, 'GBP');
그것은 잘 작동하고 돌아옵니다 "$123.00
", "R$123.00
", "£123.00
"각각 예상대로.
그러나 음수는 선행 마이너스 대신 "-"대신 괄호로 둘러싸인 "회계 스타일"으로 인쇄됩니다.
예 :
$cFormatter->formatCurrency(-456, 'USD');
보고 "($456.00)"
, 내가 원하지만 "-$456.00"
. 분명히 이것을하는 간단한 방법이 있습니까?
접두사와 PostFix를 다음과 같이 재정의하여 브래킷을 제거 할 수 있습니다.
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-");
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_SUFFIX, "");
그러나 나는 통화 기호를 얻지 못한다 "-456.00"
.
negative_prefix 속성을 설정할 때 사용해야 할 통화 기호에 대한 탈출 코드가 있습니까?
편집하다: 내가 찾고있는 결과를 주면 다른 로케일을 설정하게되어 기쁩니다.
편집 2 : 보고 INTL 라이브러리 문서 (NumberFormatter를 구현하는 데 사용되는 라이브러리), 다음은 유망한 것으로 보였습니다.
¤ ( u00a4) : 접두사 또는 접미사 : 통화 부호가없고 통화 기호로 대체됩니다. 두 배가되면 국제 통화 기호로 대체됩니다. 3 배가 된 경우 통화 복수 이름 (예 : 미국 달러) 또는 "미국 달러"로 대체되었습니다. 패턴으로 존재하는 경우, 금전적 소수 분리기가 소수점 분리기 대신 사용됩니다.
하지만 이것은:
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-¤");
"-¤123"을 인쇄하므로 기쁨이 없습니다.
편집 3 : 답을 찾았다 고 생각합니다. 아래를 참조하십시오.
해결책
나는 EN_US 로케일 행동을 내가 찾고있는 것에 대해 약간 덜 해킹하는 방법을 찾았습니다. getPattern () / setpattern () 기능.
$cFormatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
$sPattern = $cFormatter->getPattern(); // returns "¤#,##0.00;(¤#,##0.00)";
$sMyPattern = "¤#,##0.00;-¤#,##0.00";
$cFormatter->setPattern($sMyPattern);
$cFormatter->formatCurrency(-456, 'USD'); // returns -$456.00
다른 팁
그렇게함으로써, 당신은 현지화의 요점을 망치고 있습니다. ¤은 달러 표시를 나타내고 패턴이 항상 숫자의 시작 부분에 표시를 넣는다 고 말하고 있기 때문에 모든 통화의 경우는 아닙니다. 괄호를 제거하고 싶다면 더 많은 것을 갈 것입니다.
$locale = 'en_US';
$nf = new \NumberFormatter($locale, \NumberFormatter::CURRENCY);
$nf->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, $decimals);
$pattern = str_replace(array('(',')'),'',$nf->getPattern());
$nf->setPattern($pattern);
echo $nf->format($number);
단순히 당신은 할 수 있습니다
$cFormatter->setTextAttribute(NumberFormatter::PAD_BEFORE_PREFIX, '-$')."\n";