Заполнение целой части PHP

Мне нужно заполнить целую часть 0, целая часть должна быть не менее 2 символов

str_pad( 2    ,2,"0",STR_PAD_LEFT);// 02 -> works
str_pad( 22   ,2,"0",STR_PAD_LEFT);// 22 -> works
str_pad( 222  ,2,"0",STR_PAD_LEFT);// 222-> works
str_pad( 2.   ,2,"0",STR_PAD_LEFT);// 2. -> fails -> 02. or 02
str_pad( 2.11 ,2,"0",STR_PAD_LEFT);// 2.11-> fails -> 02.11

Есть ли простой код для этого?

Если возможно то же самое на Java, пожалуйста

double x=2.11;
String.format("%02d%s", (int) x, String.valueOf(x-(int) x).substring(1))

не только уродлив, но и печатает 02.10999999999999988

редактировать для Java: заполнение целочисленной части Java


person Community    schedule 08.07.2012    source источник
comment
str_pad работает со строками. Вы должны разделить целую и десятичную части перед применением str_pad к целой части, а затем добавить десятичную часть.   -  person Jérôme    schedule 08.07.2012


Ответы (5)


Вы также можете использовать функции printf() для заполнения целого числа:

Что-то вроде (codepad):

<?php

function pad($n) {
    $n = explode('.', (string)$n);

    if (2 === count($n)) {
        return sprintf("%02d.%d\n", $n[0], $n[1]);    
    }

    return sprintf("%02d\n", $n[0]);    
}

foreach (array(2, 22, 222, 2., 2.11) as $num) {
    echo pad($num);
}

// returns 02, 22, 222, 02, 02.11
person Boris Guéry    schedule 08.07.2012

Нет, простого способа нет.

function padIntegerPart($n, $len) {
    $intPart = (int)$n;

    return str_repeat('0', max(0, $len - 1 - floor(log($intPart, 10)))) . $n;
}
person Community    schedule 08.07.2012
comment
Кстати, sprintf с %*f будет работать только с фиксированным десятичным разрядом. (Почему я не могу комментировать другие ответы?) - person ; 08.07.2012
comment
Я думаю, вам нужно больше репутации. - person netmano; 08.07.2012

Быстрое решение: http://codepad.org/EXcbqGos.

$num = 2.11;
echo str_pad( floor($num) ,2,"0",STR_PAD_LEFT).substr($num-floor($num), 1);

Это будет работать только для неотрицательных чисел.

person netmano    schedule 08.07.2012

Если результат, который вы ищете, равен 02.11, попробуйте sprintf():

sprintf("%05.2f", 02.11); // Output: 02.11
           ^ ^--- float precision
           |--- total string length

sprintf("%07.2f", 02.11); // Output: 0002.11

Ссылки, которые могут помочь:

http://us2.php.net/sprintf

Дополнительные ведущие нули при печати с плавающей запятой с помощью printf?

person dbazile    schedule 08.07.2012

Еще один :

function my_str_pad ($input ,$pad_length, $pad_string) {
    $pad_length += strlen($input) - strlen(intval($input));

    return str_pad($input, $pad_length, $pad_string, STR_PAD_LEFT);
}

Следующий тест:

str_pad(2., 2, "0", STR_PAD_LEFT);// 2. -> fails -> 02. or 02

Сбой, потому что str_pad работает со строкой, но вы ввели число с десятичной запятой, но без десятичной части, поэтому оно считается целым числом. Если вы хотите сохранить '.' вместо этого используйте следующее:

str_pad("2.", 2, "0" , STR_PAD_LEFT);// 2. -> works
person Jérôme    schedule 08.07.2012