Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   100000 в 100 000 (http://www.flasher.ru/forum/showthread.php?t=165715)

54321go 26.08.2011 02:03

100000 в 100 000
 
Как сделать, из числа 100000 строку 100 000, то есть с пробелом? Подскажите функцию

t4arty 26.08.2011 02:15

писать свою

Psycho Tiger 26.08.2011 02:29

Вариант вроде такого неправильный:
Код AS3:

var a:String=String(num);
var l:int=a.length / 3;
var b:String="";
for (var i:int=0; i<l; i++){
b+=b.substr(i*3,3)+" ";
}

Потому что парсит слева-направо. Надо наоборот.
Вариант 2:
Код AS3:

var a:int=num;
var str:String="";
var c:int=0;
while (a){
if (c++ === 3) str=" "+str;
str=String(a%10)+str;
a*=0.1;
}

Вот так мужественно, но расточительно с точки зрения ресурсов... Надо бы отцеплять по 3 разряда и делить разом на 1000, хех...
Вариант 3:
Код AS3:

var a:int=num;
var str:String="";
var c:int=0;
while (a){
if (a >= 1000) a=" "+a;
str=String(a%1000)+str;
a*=0.001;
}

Но как-то пробел добавит спереди, надо ещё хитрее.
Но меня беспокоит производительность. А вдруг число 100000000000000000?
Вот в ByteArray если писать циферки, не думая, а потом считать задом наперед, вот да...
P.S. пол 5 утра, код писался здесь и не тестился. Почти уверен, что нерабочий... Но Вы дерзайте, я вот в Вас верю.

ChuwY 26.08.2011 05:55

Как-то так. На производительность не проверял.
Код AS1/AS2:

function separateDigitStr(str : String, delimiter : String = ".", count : int = 3):String{
      // assert
      if(count < 1){
        throw new ArgumentError("Количество знаков между разделителями должно быть больше нуля.");
      }
      //
      var nSeparates : uint = Math.ceil(str.length/count)-1;
      var shift      : uint = str.length%count;
      var head      : String = "";
 
      if(nSeparates && shift){
        head = str.substr(0, shift) + delimiter
        str = str.substr(shift);
        nSeparates--;
      }
 
      for(var i : int = 0; i < nSeparates; i++){
        str = str.substr(0, count*(i+1) + i) + delimiter + str.substr(count*(i+1) + i)
      }
 
      return head + str;
}


etc 26.08.2011 09:34

http://www.flasher.ru/forum/showpost...70&postcount=5

з. Ы. Не учитывает плавающую запятую и знак.

wvxvw 26.08.2011 11:36

Код AS3:

private function addSpaces(input:Number):String
{
        var result:String = "";
        for (; input > 1; input /= 1000)
                result = int(input % 1000) + " " + result;
        return result;
}

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

arkadattx 26.08.2011 11:39

А что такое input? Там переменная нигде не потерялась?

wvxvw 26.08.2011 11:41

input - аргумент функции. Простые типы передаются по значению, так что можно изменять / присваивать, если хочется.

arkadattx 26.08.2011 11:54

Ой, что-то аргумент не заметил.
Смущает конструкция
for (; input > 1; input /= 1000)

bav 26.08.2011 12:00

Код:

for (; input > 1; input /= 1000)
За ненадобностью опущено объявление итератора цикла. Точно также допустимо опускать и прочее, вот, например, бесконечный цикл:
Код:

for ( ; ; ) { ... }

i.o. 26.08.2011 12:01

Цитата:

Смущает конструкция
for (; input > 1; input /= 1000)
Это нормально. Можно написать даже for( ;; ) - будет аналог while (true)

wvxvw 26.08.2011 12:07

Если мы опишем в BNF то, как должен выглядеть цикл for, то получим следующее:
Код:

ForLoop          ::= 'for' '(' Expression ';' Expression ';' Expression ')' Block
Block            ::= '{' ListOfExpressions '}'
                  |  Expression
ListOfExpressions ::= Expression ';' ListOfExpressions
                  |  Expression
Expression        ::= Declaration | Application | e /* e - empty string */

Конечно, после этого накладываются определенные семантические ограничения, например, выражения не могут содержать объявления классов и т.п. Но нет никаких ограничений на то, чтобы выражение было пустой строкой.
Что такое Declaration и Application в этом примере не рассматривается потому что пришлось бы весь синтаксис языка, практически описать :)

ChuwY 26.08.2011 12:35

Почему-то изначально был уверен, что именно wvxvw предложит регэкспы :)
/me уже хочет стереть свой первый пост в теме.

fish_r 26.08.2011 14:06

если можно две регулярки фоткнуть зачем ограничиваться одной? :)
Код AS3:

            var numString:String = String(- 5468768464.832342);
            var splitElems:Array = numString.match(/(-\D?)?(\d+)?([\.|,].*)?/);
            var msb:int = splitElems[2].length % 3;
            var head:String = splitElems[2].slice(0, msb);
            var match:Array = splitElems[2].slice(msb).match(/(\d{3})/g);
            splitElems[2] = head.length > 0? head + " " + match.join(" "):match.join(" ");
            splitElems.shift();
            var delimString:String = splitElems.join("");
            ///-5 468 768 464.832342


alatar 26.08.2011 16:14

http://help.adobe.com/ru_RU/FlashPla...Formatter.html

ProxyGreen 26.08.2011 16:27

Зачем две если можно одной?
Код AS3:

function numSplitting(num:Number, str:String = " "):String {
                                //str- строка которой рубим число.
                        var regE:RegExp =/(?<=(\d))(?=(\d{3})+(\.\d+)?$)/g
                        var retStr:String = String(num).replace(regE, str);
                        return retStr;
                }


nOobCrafter 26.08.2011 16:27

Код AS3:

 /**
  * Преобразуем входящее числовое значение в красивую строку виде "10 000"
  * @param        $value число в виде строки
  * @return Красивенькая строка нужного содержимого
  */

 public static function getPrettyNumber($value:String, $separator:String = " "):String
 { 
        return $value.length < 3 ? $value : getPrettyNumber($value.substr(0, $value.length - 3), $separator) + $separator + $value.substr($value.length - 3, $value.length);
 }


etc 26.08.2011 16:36

Цитата:

Сообщение от alatar (Сообщение 1025721)

А слона-то и не заметили. Спасибо.

t4arty 26.08.2011 17:17

Цитата:

Сообщение от alatar (Сообщение 1025721)

Спасибо = )

ПС: надо почаще в справку заглядывать :)

in4core 26.08.2011 17:27

Код AS3:

private function addSpaces(input:Number):String
{
        var result:String = "";
        for (; input > 1; input /= 1000)
                result = int(input % 1000) + " " + result;
        return result;
}

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

fish_r 26.08.2011 17:39

Не понятно - что ваше выражение ищет? Попробуйте на практике.
ЗЫ. Если бы можно было одним я бы сделал одним выражением.

Код AS3:

function numSplitting(num:Number, str:String = " "):String {
                                //str- строка которой рубим число.
            var regE:RegExp =/(?<=(\d))(?=(\d{3})+(\.\d+)?$)/g
            var retStr:String = String(num).replace(regE, str);
            return retStr;
        }

Цитата:

Сообщение от alatar (Сообщение 1025721)

ага, пришёл - весь энтузиазм поломал! :D

ProxyGreen 26.08.2011 17:52

Цитата:

Сообщение от fish_r (Сообщение 1025741)
Не понятно - что ваше выражение ищет? Попробуйте на практике.
ЗЫ. Если бы можно было одним я бы сделал одним выражением.

Хе хе всё опробовано, выражение ищет не символы, а позиции, и их в последствии заменяет на 'str' :)

fish_r 26.08.2011 18:03

Цитата:

Сообщение от ProxyGreen (Сообщение 1025744)
Хе хе всё опробовано, выражение ищет не символы, а позиции, и их в последствии заменяет на 'str' :)

Гм.. и правда. Остроумно. Не уловил что замена, а не поиск. Извиняюсь :)

ProxyGreen 26.08.2011 18:26

Ну это не я придумал. Такая задачка была в:

"Регулярные выражения, 3-е изд. (Джеффри Фридл, 2008)"

Более подробной книжки по регам не видел.

fish_r 26.08.2011 21:38

А! Ну раз это мастер кунг-фу написал, то придраться можно: дело в том, что разделитель триад после точки либо не надо делать, либо делать в обратную сторону, т.е. справа-налево. Так что все равно неправильно :D

ProxyGreen 27.08.2011 19:20

Таки признаю что одним выражением тут не вывезешь:
Код AS3:

function numSplitting(num:Number, str:String = " "):String {
                        var sprlitReg:RegExp =/([^.]+)(\.\d+)?/;
                        var regE:RegExp =/(\d{1,3})(?=(?:\d{3})+$)/g;
                        var regRest:RegExp =/(\d{3})(?=\d)/g;
 
                        var retStr:String = String(num);
 
                        var main:String = retStr.replace(sprlitReg, "$1").replace(regE,"$1"+str);
                        var rest:String = retStr.replace(sprlitReg, "$2").replace(regRest, "$1" + str);
 
            retStr = main + rest;
                        return retStr;
                }

Теперь всё угрюмо и неинтересно, зато по правилам, но про такое деление дробной части честно говоря впервые слышу :D

Psycho Tiger 28.08.2011 23:54

Цитата:

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

in4core 29.08.2011 03:42

Цитата:

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

i.o. 29.08.2011 09:40

Код AS3:

private function addSpaces(input:Number):String
{
        var result:String = "";
        for (; input > 1; input /= 1000)
                result = int(input % 1000) + " " + result;
        return result;
}

Цитата:

но все же лучше написать просто ( криво) и понятно, чем красиво, но сложно для понимания
Что такого сложного Вы нашли в этих 4 строчках?

Hamid 29.08.2011 11:58

В книжке "сборник рецептов" есть про такое форматирование стр. 108-113, там нужна библиотека ascb(в книжке должна быть ссылка на нее)

in4core 29.08.2011 12:48

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

maxkar 29.08.2011 12:53

Цитата:

Что такого сложного Вы нашли в этих 4 строчках?
Проблема в том, что для выдачи "правильного" результата, нужно написать еще столько же строчек. Например, для начального числа 100000 на выходе получается "100 0 ". Читать такие числа пользователю будет достаточно сложно.

Наблюдаю за темой с момента её появления. Что интересно - про данную ошибку никто даже не упомянул, хотя найти ее очень просто :).

Psycho Tiger 29.08.2011 16:45

Цитата:

Что интересно - про данную ошибку никто даже не упомянул
Вот не надо, вот не надо!
Ещё в начале темы я элегантно на это намекнул )

@incore, бесспорно, код без математики, с регулярками
Код AS3:

            var numString:String = String(- 5468768464.832342);
            var splitElems:Array = numString.match(/(-\D?)?(\d+)?([\.|,].*)?/);
            var msb:int = splitElems[2].length % 3;
            var head:String = splitElems[2].slice(0, msb);
            var match:Array = splitElems[2].slice(msb).match(/(\d{3})/g);
            splitElems[2] = head.length > 0? head + " " + match.join(" "):match.join(" ");
            splitElems.shift();
            var delimString:String = splitElems.join("");

ГОРАЗДО более понятен чем вот этот, с математикой.
Код AS3:

private function addSpaces(input:Number):String
{
        var result:String = "";
        for (; input > 1; input /= 1000)
                result = int(input % 1000) + " " + result;
        return result;
}


in4core 29.08.2011 19:51

Psycho Tger - бесспорно в данном случае такая математика лучше чем реги. Но это только в этом случае и еще немногих.

etc 29.08.2011 19:57

in4core, на прошлой странице ты утверждал, что такая «непонятная» математика — это плохо. Так какой правильный вариант?

Psycho Tiger 29.08.2011 20:34

Цитата:

Сообщение от in4core (Сообщение 1026621)
Psycho Tger - бесспорно в данном случае такая математика лучше чем реги. Но это только в этом случае и еще немногих.

Тогда мне совершенно непонятно, к чему Ваши размышления о бытие в этой теме.

fish_r 29.08.2011 21:30

Цитата:

Сообщение от Psycho Tiger (Сообщение 1026559)
@incore, бесспорно, код без математики, с регулярками
...

ГОРАЗДО более понятен чем вот этот, с математикой.

Цитата:

Сообщение от in4core (Сообщение 1026621)
Psycho Tger - бесспорно в данном случае такая математика лучше чем реги. Но это только в этом случае и еще немногих.

Ага, давайте "свободному художнику" мимо ходом под*опник дадим! :D

Не нахожу бесспорного превосходства, в данном случае, математики перед рег.-ом. Аргумент о неясности -
чушь, извиняюсь. Быстродействие? Да может быть, но быстродействие не всегда решает. Зато выражение
wvxvw-га требует некоторой подготовки аргумента, а мой - нет.

Не, мне его код очень нравится. Правда. Но я то тут причем? :)

Psycho Tiger 29.08.2011 21:40

fish_r, мы о другом говорим. Я нигде не говорил что твой (ничего, что я на ты?) код плох или что-то вроде этого. Вполне возможно, твой код лучше и правильней. Но при поверхностном просмотре понять что он делает гораздо сложнее.

dimarik 29.08.2011 21:41

Я аккуратно предупреждаю.

Добавлено через 4 минуты
... что болезнь эта неизлечима ) Ветка переедет во флейм.

джонатан 04.09.2011 20:18

Код AS3:

import flash.globalization.NumberFormatter;
import flash.globalization.LocaleID;
 
var nf:NumberFormatter = new NumberFormatter( LocaleID.DEFAULT );
trace( nf.formatNumber( 123456789.23 ) ); //output: 123 456 789,23



Часовой пояс GMT +4, время: 21:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.