Рубиноподобный вопрос: сделайте эту функцию короче (ActionScript 3) - PullRequest
4 голосов
/ 04 марта 2009

Я только что написал этот невероятно подробный код, чтобы превратить числа вроде 2 в 02. Не могли бы вы сделать эту функцию короче, пожалуйста (поддерживая функциональность)? public static function format(n:int, minimumLength:int):String { var retVal:String = n.toString(); var stillNeed:int = minimumLength - retVal.length; for (var i:int = 0; i < stillNeed; i++) { retVal = "0" + retVal; } return retVal; } Пожалуйста, используйте типы для переменных. Дополнительные баллы (баллы хорошего настроения, а не баллы SO), если уже есть встроенная функция, о которой я не знаю.

Если кто-то захочет опубликовать какой-нибудь чрезвычайно короткий эквивалент на каком-то другом языке, это тоже будет забавно.

Ответы [ 9 ]

4 голосов
/ 05 марта 2009

Это не самая быстрая реализация (она делает ненужное копирование и имеет цикл), но она приятна и читаема:

public static function pad(num:int, minLength:uint):String {
    var str:String = num.toString();
    while (str.length < minLength) str = "0" + str;
    return str;
}
4 голосов
/ 04 марта 2009

Кристоф Херреман почти понял все правильно, но его метод добавляет больше нулей, а не дифференциальную величину. Я исправил это немного:

public static function format(n:int, minimumLength:int):String {
  var v:String = n.toString();
  var stillNeed:int = minimumLength - v.length;       
  return (stillNeed > 0) ? v : String(Math.pow(10, stillNeed) + v).substr(1);
}

Моя предыдущая попытка:

 public static function format(n:int, minimumLength:int):String {
    var stillNeed:int = minimumLength - n.toString().length;               
    return (n.split("").reverse().join("") as int) // 32 -> 23
             *Math.pow(10, stillNeed > 0 ? stillNeed : 0).toString() // 23000
                 .split("").reverse().join("");  // 00032
 }

 public static function formatAny(n:Number, minimumLength:int):String {
    return format((int)n) + n.toString().split('.')[ 1 ];
 }

 // use this if you want to handle -ve numbers as well
 public static function formatAny(n:Number, minimumLength:int):String {
    return (n < 0 ? '-' : '') + formatAny(n, minimumLength);
 }
4 голосов
/ 04 марта 2009

Я не думаю, что есть встроенный способ, но он может быть чище (если не обязательно лучше):

//20 zeroes, could be more if needed
public static var Zeroes:String = "00000000000000000000"   

public static function format(n:Number, minimumLength:int):String {
var retVal:String = (n.toFixed(0)); // cut off the decimals
var stillNeed:int = minimumLength - retVal.length;
retVal = Zeroes.substring(0, stillNeed) + retVal; 
return retVal;
}

Var "zeroes" устраняет необходимость в цикле, просто добавьте столько нулей, сколько вам нужно, из предварительно созданной строки.

3 голосов
/ 04 марта 2009

Как насчет этого:

public static function format(n:int, len:int):String {
  var v:String = n.toString();
  return (v.length >= len) ? v : String(Math.pow(10, len) + n).substr(1);
}

Между прочим, нет встроенной функции. Если вам нужны приличные функции заполнения, взгляните на StringUtils в Apache Commons Lang.

2 голосов
/ 30 мая 2009

Рекомендует остроумно и всем остальным, кто ответил здесь, но, видимо, люди голосуют, не пытаясь на самом деле код.

Последняя функция Dirkgently в основном правильная, но его '>' должно быть '<'. </p>

Эта функция работает по желанию (проверено довольно тщательно):

public static function format(n:int, minimumLength:int):String {
  var v:String = n.toString();
  var stillNeed:int = minimumLength - v.length;
  return (stillNeed < 0) ? v : String(Math.pow(10, stillNeed) + v).substr(1);
}
1 голос
/ 07 марта 2009

Пакет as3corelib, выпущенный Adobe, имеет небольшой класс NumberFormatter, который использует серию классов STATIC. В этом случае вы можете использовать функцию addLeadingZero.

//The following method is from the NumberFormatter class of the as3corelib package by Adobe.
public static function addLeadingZero(n:Number):String
{
var out:String = String(n);

if(n < 10 && n > -1)
{
    out = "0" + out;
}

return out;
}

Я включил функцию, чтобы показать ее простоту, но я бы использовал пакет вместо вызова функции, поскольку он предоставляет много других полезных функций, таких как StringUtils, методы шифрования, такие как MD5, blowfish и т. Д.

Вы можете скачать пакет здесь Для новых пользователей вы должны указать путь к классам, где находится этот пакет. Также целесообразно импортировать классы вместо использования их полностью определенных имен классов.

1 голос
/ 05 марта 2009

Я всегда делал это, беря строку, которая является максимальной шириной заполненных нулей, содержащих все нули, затем добавляя строку к дополненной к концу строки нулей и затем используя подстроку, чтобы получить цифры длины правой руки.

Что-то вроде:

function pad(num:int, length:unit):String{
    var big_padded:String "0000000000000000000000000000" + num.toString();
    return big_padded.substring(big_padded.length - length);
 }
1 голос
/ 05 марта 2009

"Если кто-то хочет опубликовать некоторые очень короткий эквивалент в некоторых другой язык, это тоже было бы весело. "

В javascript это просто - вставьте это в адресную строку вашего браузера

javascript: function zit (n, w) {var z = "000000000000000000"; return (z + n) .substr (-w);} alert (zit (567, 9)); недействительным (0);

0 голосов
/ 02 июля 2014
private function leadingZeros(value:int, numDigits:int):String
{
            return String(new Array(numDigits + 1).join("0") + String(value)).substr(-numDigits, numDigits);
}
...