كيف يمكنني التعرض لطباعة قيم العملة السلبية مع علامة ناقص؟

StackOverflow https://stackoverflow.com/questions/1160860

سؤال

أنا أستخدم PHP numberformator. فئة لطباعة قيم العملة.

على سبيل المثال:

  $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".

هل هناك بعض رمز الهروب للحصول على رمز العملة الذي أحتاج إلى استخدامه عند تعيين سمة CAMMAL_PREFIX؟

يحرر: أنا سعيد بتعيين لغة مختلفة إذا كان ذلك يعطيني النتيجة التي أبحث عنها.

تحرير 2: أنظر إلى مستندات مكتبة Intl. (وهي المكتبة المستخدمة في تنفيذ NumberFormatter)، بدا ما يلي واعدة:

¤ ( u00a4): بادئة أو لاحقة: لا توجد علامة عملة، واستبدالها رمز العملة. إذا تضاعفت، استبدالها برمز العملة الدولية. إذا تم استبدال ثلاثة أضعاف، استبدالها بأسماء الجمع العملة، على سبيل المثال، "الدولار الأمريكي" أو "دولار أمريكي" لأمريكا. إذا كان موجودا في نمط، فسيتم استخدام الفاصل العشري النقدية بدلا من الفاصل العشري.

ولكن هذا:

$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";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top