Добавьте разделитель тысяч к любому числу, даже если оно содержит специальные символы

1

У меня есть сайт в норвежском формате, поэтому цена продукта отображается как 1000,-.

Это сайт на основе Magento, версия ce-1.9.2.1.

Теперь я хочу добавить тысячу разделителей (скорее всего, пробелы, но может быть любым символом) к этой цене, поддерживая ее формат, используя функцию number_format или регулярное выражение, в зависимости от того, что лучше всего поддерживает целостность (например, 1 000,-, 1 000 000,- и т.д.).

У кого есть предложения?

Теги:
number-formatting
magento-1.9

2 ответа

1
Лучший ответ

Используя lookarounds в preg_replace вы можете сделать это:

$str = preg_replace('/\..*$(*SKIP)(*F)|(?<=\d)(?=(?:\d{3})+(?!\d))/', ' ', $str);

\..*$(*SKIP)(*F) будет игнорировать/пропускать часть после DOT для этого преобразования.

Демо-версия RegEx

  • 0
    Ваше регулярное выражение почти работает, но оно игнорирует первое появление '.' десятичный разделитель, вы можете обновить его, чтобы не помещать разделитель тысяч после того, как он найдет '.' ?
  • 0
    Таким образом, например, ввод будет: 1000123.45678 и вы хотите 1 000 123.45678 качестве вывода?
Показать ещё 2 комментария
0

Согласно моим 5-минутным исследованиям в google, формальный формат валюты для норвежской кроны - #.###,##.

Единственная разница между этим форматом и тем, который вы предлагаете, заключается в том, что разделитель Krone является " "вместо" . ", а специальное значение" ,00 "заменяется на" ,- ".

Основываясь на этом наблюдении, я просто выполнил бы следующий код, учитывая правильно отформатированное значение в формальном определении:

// expects "1.234,00" returns "1 234,-"
//     "1.234.567,00" ==> "1 234 567,-"
//              5,50  ==>          5,50
function kroneDisplayFormat($formalFormat) {
    $intermediate = str_replace(".", " "); // replace . separator with ' ' (space)
    if( endsWith( $intermediate, ",00")) {
       // special display case ",00" ==> ",-"
       $final = str_replace(",00", ",-");
    } else {
       $final = $intermediate
    }
    return $final
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню