Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Округление числа с двумя запятыми (http://www.flasher.ru/forum/showthread.php?t=173802)

ded100let 11.01.2012 21:53

Округление числа с двумя запятыми
 
привет всем. Нужно выводить числа в виде 00.000.00. Тоесть 1 - это 00.000.01, а 100 это уже 00.001.00 и так далее. Кто подскажет как быть, где искать?

Добавлено через 1 минуту
можно ли решить это стандартными методами или нужно танцевать с бубном?

goodguy 11.01.2012 21:57

Цитата:

можно ли решить это стандартными методами
Нельзя. Прийдется изобретать свое. Но никаких танцев с бубном я тут не вижу. Задача довольно простая
я недавно писал нечто подобное
Код AS3:

public static function formatToString(number:int, length:int):String {
        var string:String = "";
        var numberLength:int = String(number).length;
 
        if (numberLength >= length) length = numberLength;
        for (var i:int = 0; i < length; i++) string += "0";
 
        var endIndex:int        = length - numberLength;
        string = string.substring(0, endIndex);
        string += String(number);
 
        return string;
}

Передаем нужное число и необходимую длину, а метод возвращает строку.
Если передать 100 и длину 5, то вернет 00100
думаю добавить сюда еще и точки, особого труда не составит

GBee 11.01.2012 23:00

Код AS3:

import flash.globalization.NumberFormatter;
 
public static function formatToString(number:int):String
{
    var nf:NumberFormatter = new NumberFormatter("en_US");
    nf.groupingPattern = "2;3;2";
    nf.groupingSeparator = ".";
    nf.trailingZeros = false;
    var num:int = number + 10000000;
    var str:String = nf.formatNumber(num);
    return str.substr(2);
}

;о)

Wolsh 11.01.2012 23:45

Кибадачи от iNilsa:
Код AS3:

var num:uint = 1000;
var st:String = "000000" + num;
var s:String = st.substr(-7, 2) + "." + st.substr(-5, 3) + "." + st.substr(-2, 2)
trace(s);


GBee 12.01.2012 00:05

Цитата:

Кибадачи от iNilsa:
flawless victory :cool:


PS Где кнопка "запомнить ответ"?

Zebestov 12.01.2012 00:59

Цитата:

Сообщение от Wolsh (Сообщение 1056233)
Кибадачи от iNilsa

или так:
Код AS3:

var num:uint = 1000;
var st:String = "000000" + num;
var s:String = st.replace(/(\d*)(\d{2})(\d{3})(\d{2})/, "$2.$3.$4");
trace(s);

:)

ded100let 12.01.2012 00:59

спасибо всем, помогли!!!!

GBee 12.01.2012 02:12

Цитата:

Сообщение от Zebestov (Сообщение 1056245)
или так:
Код AS3:

var num:uint = 1000;
var st:String = "000000" + num;
var s:String = st.replace(/(\d*)(\d{2})(\d{3})(\d{2})/, "$2.$3.$4");
trace(s);

:)

http://gskinner.com/RegExr/ здесь не проходит, а было бы неплохо.

Zebestov 12.01.2012 02:15

Хм... ничего не понял.

GBee 12.01.2012 02:40

регексп не работает, или это не регексп? :о/

Zebestov 12.01.2012 02:42

Где не работает?

GBee 12.01.2012 02:44

Издеваетесь?

сайт http://gskinner.com/RegExr/ я на нем все свои регекспы отлаживаю.

Добавлено через 1 минуту
А понял, ваш только для семизначного числа

Zebestov 12.01.2012 03:00

Цитата:

Сообщение от GBee (Сообщение 1056268)
А понял, ваш только для семизначного числа

Наш? (оглядывается по сторонам в темной комнате, высаживается понемногу)
Немедленно начинай мне тыкать! =)

Не только для семизначного, там можно как угодно поправить. Другое дело, что:
1. так в задаче было надо
2. и не забывай, что мы с iNilsом (становится поближе к iNilsу, чувствует себя крутым) добавляем на всякий случай кучу ноликов перед числом

GBee 12.01.2012 03:09

Мне мама запрещала тыкать. Ну раз теперь можно... (шутка про коня с баша)

А есть вариант именно для любого числа, чтобы регекспом и нули "дописывались"?

Zebestov 12.01.2012 03:18

Цитата:

Сообщение от GBee (Сообщение 1056274)
А есть вариант именно для любого числа, чтобы регекспом и нули "дописывались"?

Не подскажу... не особо-то я крут в регекспах — по любому поводу в гугл искать доки )

zuxul 12.01.2012 09:30

почему не устраивает так :) ?
Код AS3:

("000000" + num).replace(/(\d*)(\d{2})(\d{3})(\d{2})/, "$2.$3.$4")


GBee 12.01.2012 16:12

Цитата:

почему не устраивает так ?
Устраивает! Но вот чистым бы регекспом.

iNils 12.01.2012 16:26

Цитата:

Сообщение от GBee (Сообщение 1056340)
Устраивает! Но вот чистым бы регекспом.

На сколько чистым?

GBee 12.01.2012 17:28

Чтобы только replace без пред и пост обработки. Мне интересно, вообще возможно ли это, потому как один человек мне категорично заявил, что регекспом строку ВООБЩЕ не отформатировать. Я в них только разбираться начинаю (надоели извращения со сплитами и джоинами), так что интерес велик.

Добавлено через 5 минут
А я тут еще сам притормаживаю, думал второй параметр тоже регексп, а это коды замены replace'a.
Пардоньте.

i.o. 12.01.2012 18:42

Цитата:

Я в них только разбираться начинаю (надоели извращения со сплитами и джоинами)
Регексы не такие уж шустрые, чтобы сувать их повсюду. В данном случае пост №4 считаю лучшим решением :)

GBee 12.01.2012 19:42

Цитата:

В данном случае пост №4 считаю лучшим решением
Ну вот я уже сомневаюсь, надо тесты проводить.

3 сабстринга и 4 конкатенации против одного реплейса и одной конкатенации.

Добавлено через 10 минут
Код AS3:

package
{
        import flash.display.Sprite;
 
        public class Test extends Sprite
        {
                public function Test():void
                {
                        var i:int = 0;
                        var t:Number;
                    var len:int = 1000000;
 
                        t = new Date().getTime();
                        for(i = 0; i<len; i++)
                                parse1(i);
                        trace("parse1", new Date().getTime() - t);
 
                        t = new Date().getTime();
                        for(i = 0; i<len; i++)
                                parse2(i);
                        trace("parse2", new Date().getTime() - t);
                }
 
 
                private function parse1(num:int):String
                {
                        var st:String = "000000" + num;
                        return st.replace(/(\d*)(\d{2})(\d{3})(\d{2})/, "$2.$3.$4");
                }
 
                private function parse2(num:int):String
                {
                        var st:String = "000000" + num;
                        return st.substr(-7, 2) + "." + st.substr(-5, 3) + "." + st.substr(-2, 2);
                }
        }
}

parse1 9157
parse2 2788

Абсолютно чистая победа за №4. :о))

i.o. 12.01.2012 22:09

Цитата:

parse1 9157
parse2 2788
Ну тесты в дебажном плеере мало о чем говорят... :D

GBee 12.01.2012 22:20

Вот Фома-то :о)). В релизе:

parse1: 6369
parse2: 1313

Безупречно чистая победа.

etc 12.01.2012 22:42

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

GBee 12.01.2012 23:10

Я много чего еще не знаю. Кто, например, задал эти умолчания, или это как-то эмпирически вычисляется?

etc 12.01.2012 23:13

Страшная тайна: RegExp написан на AS3.

GBee 12.01.2012 23:22

Грусть Печаль

etc 12.01.2012 23:24

Да, поэтому предпочтение отдаётся ломовым методам, чаще всего.

i.o. 12.01.2012 23:41

Цитата:

Страшная тайна: RegExp написан на AS3.
O_O
Пруф в студию.

wvxvw 13.01.2012 02:36

Код AS3:

private static const _pattern:ByteArray = new ByteArray();
 
private static const _separator:int = 0x2E;
 
private static const _asciiZero:int = 0x30;
 
private static function format(digit:uint):String
{
        var reminder:uint;
 
        _pattern.clear();
        _pattern.length = 13;
        _pattern[0] = 12;
        while (_pattern[0])
        {
                reminder = digit;
                digit /= 10;
                reminder  -= digit * 10;
                if (((_pattern[0] + 1) & 2) == 2)
                        _pattern[_pattern[0]--] = _separator;
                _pattern[_pattern[0]--] = _asciiZero + reminder;
        }
        _pattern[0] = _asciiZero + digit;
        return _pattern.toString();
}

Просто от нечего делать :)

etc 13.01.2012 13:39

Цитата:

Сообщение от i.o. (Сообщение 1056458)
O_O
Пруф в студию.

Хм, в 2008-ом Блуд говорил и показывал сорсы тамарина, в котором RegExp реализовывался именно на AS3.
А вот тут уже нет: http://mod-actionscript.googlecode.c...-central/core/
Там уже используется сишный pcre. Это гут, но всё равно против лома нет приёма.

Wolsh 13.01.2012 14:32

Я в принципе не понимаю как регэксп может быть быстрее. Это из серии "если написать код в одну строчку, то будет же быстрее?" Как ни верти, а операции с данными все-равно надо произвести, магии и мистики ждать не приходится. В случае сабстринга мы конкретно говорим - возьми с такого-то индекса столько-то байт. Всё. А что должен сделать регэксп? На одном определении "число/не число" уже несколько дополнительных операций. На разборе сколько до и сколько после - еще пачка. Регэксп это не телепатия, а те же самые операции. Только в 10 раз больше, как всегда при "универсальности".

Добавлено через 9 минут
Предназначение регэкспа - поиск и извлечение по шаблону. В этой задаче нечего искать. Сабстринг не предлагает что-то искать, он называет конкретные индексы сразу. А все остальное – конкатенация – выполняется в лучшем случае точно так же (теми же машинными операциями), а возможно и гораздо проще в случае сабстринга. То, что виден вызов одной функции, не означает скорости. Сколько операций внутри этой функции? "один реплейс" может содержать сотни. А сабстринг он и есть сабстринг))

wvxvw 13.01.2012 17:22

В теории регексп может быть быстрее или сопоставим. substring / серия других AS3 функций могут быть выполнены как опкоды виртуальной машины (а не оптимизированы до машинных кодов), в то время как регулярное выражение может быть скомпилировано (и доведено до "совершенства") компилятором. В менее тривиальных случаях, например, в JS регулярные выражения могут быть быстрее аналогичного кода на JS просто потому, что скомпилировать JS будет дольше и менее производительно, чем выражение (кстати, в V8 регулярки вообще всех рвут, даже Перл).

zuxul 13.01.2012 18:32

Просветите пожалуйста, что такое V8 ?

etc 13.01.2012 19:07

Цитата:

Сообщение от zuxul (Сообщение 1056626)
Просветите пожалуйста, что такое V8 ?

http://ru.wikipedia.org/wiki/V8_(движок_JavaScript)

wvxvw 13.01.2012 19:36

Код AS3:

private static const _pattern:ByteArray = new ByteArray();
 
private static const _separator:int = 0x2E;
 
private static const _asciiZero:int = 0x30;
 
private static function format(digit:uint):String
{
        var reminder:uint = digit;
        var index:int = 12;
 
        _pattern.length = 13;
        while (index > -1)
        {
                reminder = digit;
                digit = binaryDiv10(digit);
                reminder -= (digit << 3) + (digit << 1);
                if (((index + 1) & 2) == 2)
                        _pattern[index--] = _separator;
                _pattern[index--] = _asciiZero + reminder;
        }
        return _pattern.toString();
}
 
private static function binaryDiv10(divident:uint):uint
{
        var divisor:uint = 10;
        var multiplier:uint = 1;
        var quotient:uint;
        var reminder:uint;
 
        if (divident < 10) return 0;
        while ((divisor <<= 1) < divident && multiplier < 28)
                multiplier++;
        divident -= (divisor >>>= 1);
        quotient = 1 << (multiplier - 1);
        multiplier = quotient;
        while (divident)
        {
                while ((divisor >>>= 1) > divident) multiplier >>>= 1;
                divident -= divisor;
                quotient += (multiplier >>>= 1);
        }
        return quotient;
}

Вариант с удвоенным количеством извращений :) Я чет не могу сообразить вот только, как параллельно с делением псчитать остаток %)

i.o. 14.01.2012 00:23

wvxvw, а что это вообще? <_<

wvxvw 14.01.2012 01:47

Функция format(x) возвращает строку вида хх.ххх.ххх.ххх.хх где каждый х - разряд в десятичной системе счисления, что собственно, автор и хотел. :) Она кстати будет по-быстрее, чем вариант с регулярным выражением, а если задесйствовать fastmemory + немного инлайна, то может и сравнима с substring() :) При этом используется только побитовый сдвиг, прибавление, отнимание и логические операции.

TanaTiX 14.01.2012 02:11

Код AS3:

private static const _separator:int = 0x2E;
 
private static const _asciiZero:int = 0x30;

wvxvw, а это что есть за загадочные (только для меня?) переменные?

alatar 14.01.2012 03:06

Коды символов точки и нуля.


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

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