С плавающей точкой это не получается, потому что вы передаете европейские номера (1.000.000,25 на миллион с четвертью). Функция, которую вы дали, должна работать, если вы просто переключаетесь через запятую и точку. Сначала я протестировал бы текущую версию с 1000000.25, чтобы проверить, работает ли она с неевропейскими номерами.
Следующий скрипт awk можно вызвать с помощью "echo 1 | awk -f xx.gawk"
, и он покажет вам как "нормальную", так и европейскую версию в действии. Выводит:
123,456,789.1234
123.456.789,1234
Очевидно, что вас интересуют только функции, реальный код будет использовать входной поток для передачи значений в функции, а не фиксированную строку.
function commas(n) {
gsub(/,/,"",n)
point = index(n,".") - 1
if (point < 0) point = length(n)
while (point > 3) {
point -= 3
n = substr(n,1,point)","substr(n,point + 1)
}
return n
}
function commaseuro(n) {
gsub(/\./,"",n)
point = index(n,",") - 1
if (point < 0) point = length(n)
while (point > 3) {
point -= 3
n = substr(n,1,point)"."substr(n,point + 1)
}
return n
}
{ print commas("1234,56789.1234") "\n" commaseuro("12.3456789,1234") }
Функции идентичны, за исключением обработки запятых и точек. Мы назовем их разделителями и десятичными числами в следующем описании:
- gsub удаляет все существующие разделители, так как мы вернем их обратно.
- точка находит, где находится десятичная дробь, поскольку это наша отправная точка.
- если десятичного разделителя нет, оператор if начинается с конца.
- мы зациклились, когда осталось более трех символов.
- внутри цикла, мы корректируем положение для вставки разделителя и вставляем его.
- как только цикл завершится, мы вернем скорректированное значение.