Как стать автором
Обновить

Комментарии 75

sprintf("%03d",12345);
У меня короче на 4 символа :D
Думали о таком варианте :) Но для работы с не целыми числами потребуется %..f или %..g, у которых длина включает в себя дробную часть.
Я не понимаю в чём загадка. В стандартной библиотеке почти всех языков есть какой-либо аналог printf, который просто по определению для этого более чем подходит.
Для данной задачи стандартного решения мы не нашли.
Обратите внимание, что имеет место дробная часть. sprinf('%03d', $a); не подходит.
а точка?
int main (void) { printf("%030.03f", 1.0); return 0; }
00000000000000000000000001.000

Но тут какой-то глюк. Не могу сделать только 3 знака. 30 — могу. 3 — не могу.
Это не глюк. 30 — общее количество знаков.
Хм, про дробную часть забыл. Тогда так, на вскидку
x=1.9.to_s.split('.')
"#{'%03d'%x[0]}.#{x[1]}"
Нашел один баг, код не обрабатывал ситуацию без дробной части. Вот так ок, 46 символов
x='1.1'.split('.')
x[0]='%03d'%x[0]
x.join('.')
Последняя версия, 40 :) ТС, выложите потом результаты?
x=x.to_s.split'.';x[0]='%03d'%x[0];x*'.'
27
"%03d.%s"%x.to_s.split('.')
мда, поторопился =/ без дробной части не работает
37
согласно условию: а — число, которое нужно пребразовать, b — количество знаков в целой части

'0'*(b-Math.log10(x))+a.to_s rescue a

p.s. с отрицательными числами не работает, так как условия такого не было
в скобках конечно же a, вместо x

'0'*(b-Math.log10(a))+a.to_s rescue a
return $a<$c=pow(10,$b)?substr($c+$a,1):$a;
Проверьте, пожалуйста, работоспособность этого кода.
a.PadLeft(4 + Split(".")(1).Length, «0»)
Так правильнее
Javascript, 58 символов:
n<100?(new Array(4-(""+parseInt(n)).length)).join('0')+n:n

ну тогда уж можно
n<10?«00»+n:n<100?«0»+n:n
а если не привязываться к 2 ведущим нулям

function a(n,q){return n<Math.pow(10,q)?"0"+a(n,q-1):n}
echo $d>99?$d:($d>9?"0".$d:"00".$d);

Без echo получилось 32 символа (с ; в конце). $d — число.
Не надо затачивать решение под 3 цифры. 2 параметра: $a и $b.
Как я понимаю тут приходит нам 2 параметра. Первый это само значение и второе это количество нулей спереди. По этому для широкого круга задач лучше подходит str_pad т.к. она именно для этого и предназначена.
$a = 7.45;
$b = 5;
echo str_pad((int)$a,$b,'0',STR_PAD_LEFT).strrchr($a,'.');
echo $d>99?$d:"0".($d>9?$d:"0".$d);

Без echo 31 символ. (с ; в конце).
PS: не туда отправилось.
"%0*.03f"%(int(6+log10(num+1)),num)

Python
не, не работает в целом ряду случаев
'.'.join([x(y) for x, y in zip([lambda x: x.rjust(3, '0'), lambda x: x], str(num).split('.'))])
38
function f($a, $b) { return sprintf("%0{$b}d",$a).strrchr($a,'.'); }
За что минусуете?
Задача не понятна с первого раза и кажется тривиальной
str_pad($input, $pad_length + strlen(substr($input, strpos($input, '.'))), 0, STR_PAD_LEFT);
fixed.

str_pad($input, $pad_length + (strpos($input, '.') !== false? strlen(substr($input, strpos($input, '.'))): 0), 0, STR_PAD_LEFT);

медленно, длинно и не красиво, но работает =)
"%0*f"%(x,num)


Вывод:
hi
a= 1; f= 0001.000000
a= 2; f= 0002.000000
a= 3; f= 0003.000000
a= 0; f= 0000.000000
a= -1; f= -0001.000000
a= -2; f= -0002.000000
a= -4; f= -0004.000000
a= 56.75; f= 056.750000
a= 1.0; f= 0001.000000
a= -5.45678; f= -0005.456780
a= -7.1; f= -0007.100000
a= 470.12313; f= 470.123130
a= 5678.1; f= 5678.100000
a= -101231.121231; f= -101231.121231


Правда вот х еще…
x = len("%f"%num)
if abs(num)<100: x += 1
if abs(num)<10: x += 2
Блин. Вот так:
"%0*f"%(x,num)


Вывод:
hi
a= 1; f= 001.000000
a= 2; f= 002.000000
a= 3; f= 003.000000
a= 0; f= 000.000000
a= -1; f= -001.000000
a= -2; f= -002.000000
a= -4; f= -004.000000
a= 56.75; f= 056.750000
a= 1.0; f= 001.000000
a= -5.45678; f= -005.456780
a= -7.1; f= -007.100000
a= 470.12313; f= 470.123130
a= 5678.1; f= 5678.100000
a= -101231.121231; f= -101231.121231


Правда вот х еще…
x = len("%f"%num)
if abs(num)<10: x += 1
if abs(num)<100: x += 1


Заодно нашел баг на хабре. Если истекло время редактирования коментария во время его собственно редактирования, то избавиться от окна редактирования уже не получится.
блин. я тут мучаюсь. А ОТРИЦАТЕЛЬНЫЕ-ТО НУЖНО ЧИСЛА? :-) А 0? А инты? Или только флоаты больше нуля?
ПОтому что вот на питоне сделал функцию, обрабатывающую ВСЕ варианты:
def fff(n):
    b="%+f"%n
    f="%+0*f"%(len(b)+4-b.find('.'),n)
    return f
Как я понял, число цифр в целой части вводится.
a = str(n)
'0'*(3-a.find('.'))+a

дробные числа >= 0.0
(b-len(str(int(a))))*'0'+str(a)
где a — число, b — количество цифр в целой части.
Не пинайте сильно, скорее всего я что-то не понял/что-то не учел.
Получился 31 символ
НЛО прилетело и опубликовало эту надпись здесь
a.zfill((b,b+2)['.' in a])

Правда, это без приведения к стрингу =/
// с учетом отсутствия в задаче необходимости поддержки отрицательных чисел/пустых строк/etc:
<?php

# Короче у меня не получается =(
str_repeat(0,$b-strpos($a,'.')).$a // len = 34

# изврата ради, так как регулярок вроде бы еще не было =)
preg_replace('|^(\d+)|e',"str_pad(\$1,$b,0,0)",$a) // len = 50
естественно, сравнивая, чей быстрее

Что естественного в оптимизации того, что оптимизировать не нужно? Для «не нужно» определение следующее — не нужно до тех пор, пока профайлером не доказано обратное.
Just for fun, почему нет.
Удивительно, что just for fun не соревнуются как написать самый лучший и самый поддерживаемый код, а только наоборот :-)
Это слишком банально, такие цели на работе каждый день. А вот покороче и непонятнее… :)
Обновил пост, там есть наше решение :)
А минусы считаю необоснованными.
Блин, я однажды вычищал эти нули (приводил к int) и думал, кто-же вставляет эти нули? :)
return str_pad('',3-($a|0?:1)/10,'0',0).$a;

44 c return
return str_pad('',$l-($v|1)/10,'0',0).$v;

42 c return =)
return sprintf('%03d',$a).strstr($a,'.');

41
return str_pad('',$l-($v|1)/10,0,0).$v;

40 с return!!!
return str_repeat(0,$l-($v|1)/10).$v;

38 с return
маразм крепчал))
Во-первых, зачем |1? Для чего чётное? Чтобы при числе 9 сбиться? :)
Во-вторых, работает только для небольшого спектра чисел. Например, 5-(38|1)/10 вернёт уже 1.2, воспримет, как 0, а на выходе останется 038.
В-число Эйлерских, последний аргумент для str_pad не нужен. Вы же пустую строку заполняете.
В-пятых, если исправить всё это, получится вполне лаконично, спасибо за идею :)
return str_pad('',$b-strlen($a|0),0).$a;
40 c return.
В-сорок вторых, вариант с repeat не работает, если получится отрицательное число в скобках.
Ну… про отрицательные числа речь не шла, а тесты все пройдены были (:
Отрицательное значение $l-($v|1)/10.
Попробуйте для $l=7; $b=98;
И до сих пор интересно, что Вам сделали чётные числа :)
($v|1)/10

я исключаю 0 из ответа))))
Да, красиво :) Но что с примерном для $l=7; $b=98?
$v|1; //99
($v|1)/10; //9.9
$l-($v|1)/10; //-2.9
str_pad('',$l-($v|1)/10,0,0).$v; //98
суть в том, что так
($v|1)/10

я хотел получить кол-во разрядов в числе, но видно от большого ума, что-то перепутал, здесь правильнее log10() взять, а не на 10 делить)))
а что если так:
return str_pad('',$l-log10($v|9),0).$v;
Там же не десятеричный вид :) |9 даст на конце 1**1 :) А зачем? Хватит |2 — избавит от чисел 0 и 1, в остальном — ничего не испортит. То есть |2 делает предпоследний бит 1. Но 9 он убивает.
Эх, счастье было близко, нужно что-то ещё :)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.