Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

полезные строковые и числовые функции в javascript (Rumata)
Author Message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Sun Aug 08, 2004 6:13 pm (написано за 9 секунд)
   Post subject: полезные строковые и числовые функции в javascript
Reply with quote

Code (JavaScript): скопировать код в буфер обмена
function validBrackets(br)
{
    if (!br) return false;
    return (br.length == 2 && "()[]{}<>''\"\"||//\\\\``".indexOf(br) != -1)
}

function bracketize(string, br)
{
    if (!validBrackets(br)) return string;
    return br.charAt(0) + string.toString() + br.charAt(1);
}

function unbracketize(string, br)
{
    if (!validBrackets(br)) return string;
    var i = string.indexOf(br.charAt(0));
    var j = string.lastIndexOf(br.charAt(1));
    if (i == 0 && j == string.length - 1) string = string.substring(i + 1, j);
    return string;
}

// The trim-family functions
String.prototype.ltrim = function()
{
    return this.replace(/(^\s*)/, "");
}

String.prototype.rtrim = function()
{
    return this.replace(/(\s*$)/g, "");
}

String.prototype.trim = function()
{
    return this.replace(/(^\s*)|(\s*$)/g, "");
}
использование
Code (JavaScript): скопировать код в буфер обмена
var x = "To be or not to be? That is the question!";
var y = bracketize(x, "[]");   // y === [To be or not to be? That is the question!]
var z = unbracketize(y, "[]"); // z === To be or not to be? That is the question!

var a = "   Here are some leading and trailing white spaces   ";
var b = a.ltrim(); // b === "Here are some leading and trailing white spaces   "
var c = a.rtrim(); // c === "   Here are some leading and trailing white spaces"
var d = a.trim()// d === "Here are some leading and trailing white spaces"
 


Last edited by Rumata on Tue Nov 28, 2006 11:22 am; edited 5 times in total
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Sun Aug 08, 2004 6:17 pm (спустя 4 минуты)
   Post subject:
Reply with quote

Code (JavaScript): скопировать код в буфер обмена
// The string multipling functions
String.prototype.dup = function()
{
    var val = this.valueOf();
    return val + val;
}

String.prototype.repeat = function(n)
{
    if (!n || n <= 0) return "";
    if (!this.origin) this.origin = this.valueOf();
    var val = this.repeat(parseInt(n / 2));
    return ((n % 2) ? this.origin : "") + val + val;
}

// The padding functions
String.prototype.padding = function(n, c)
{
    if (!c) c = " ";
    if (c.length > 1) c = c.charAt(0);
    var val = this.valueOf();
    var pad = c.repeat(Math.abs(n) - this.length);
    if (n < 0)
    return val + pad;
    return pad + val;
}

String.prototype.leftPad = function(n, c)
{
    return this.padding(Math.abs(n), c);
}

String.prototype.rightPad = function(n, c)
{
    return this.padding(-Math.abs(n), c);
}


Last edited by Rumata on Fri Aug 13, 2004 5:23 pm; edited 3 times in total
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Aug 11, 2004 10:07 pm (спустя 3 дня 3 часа 50 минут)
   Post subject:
Reply with quote

использование
Code (JavaScript): скопировать код в буфер обмена
x = "123".leftPad(6)// x == "   123"
x = "123".rightPad(6); // x == "123   "
 
leftPad и rightPad - оболочки над методом padding:
Code (JavaScript): скопировать код в буфер обмена
x = "123".padding(6)// x == "   123"
x = "123".padding(-6); // x == "123   "
 
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Fri Aug 13, 2004 5:43 pm (спустя 1 день 19 часов 35 минут)
   Post subject:
Reply with quote

произвел незначительные изменения в первом своем постинге

произвел существенные изменения во втором постинге:
добавил методы String.dup() и String.repeat(), по смыслу близкие функциям Space() и String() из Basic

пример использования
Code (JavaScript): скопировать код в буфер обмена
var a = "123";
var b = a.dup();     // b == "123123"
var c = a.repeat(4); // c == "123123123123"
 
их наличие требуется в методе String.padding() и косвенно в методах String.leftPad(), String.rightPad()
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Sat Aug 14, 2004 7:18 am (спустя 13 часов 34 минуты)
   Post subject: javascript/jscript sprintf function
Reply with quote

этого решения я не нашел нигде. предлагаю свое
Code (JavaScript): скопировать код в буфер обмена
/**
* sprintf(format, argument_list)
*
* The string function like one in C/C++, PHP, Perl
* Each conversion specification is defined as below:
*
* %[index][alignment][padding][width][precision]type
*
* index     - An optional index specifier that changes the order of the
*             arguments in the list to be displayed.
* alignment - An optional alignment specifier that says if the result should be
*             left-justified or right-justified. The default is
*             right-justified; a "-" character here will make it left-justified.
* padding   - An optional padding specifier that says what character will be
*             used for padding the results to the right string size. This may
*             be a space character or a "0" (zero character). The default is to
*             pad with spaces. An alternate padding character can be specified
*             by prefixing it with a single quote ('). See the examples below.
* width     - An optional number, a width specifier that says how many
*             characters (minimum) this conversion should result in.
* precision - An optional precision specifier that says how many decimal digits
*             should be displayed for floating-point numbers. This option has
*             no effect for other types than float.
* type      - A type specifier that says what type the argument data should be
*             treated as. Possible types:
*
* % - a literal percent character. No argument is required. 
* b - the argument is treated as an integer, and presented as a binary number.
* c - the argument is treated as an integer, and presented as the character
*     with that ASCII value.
* d - the argument is treated as an integer, and presented as a decimal number.
* u - the same as "d".
* f - the argument is treated as a float, and presented as a floating-point.
* o - the argument is treated as an integer, and presented as an octal number.
* s - the argument is treated as and presented as a string.
* x - the argument is treated as an integer and presented as a hexadecimal
*     number (with lowercase letters).
* X - the argument is treated as an integer and presented as a hexadecimal
*     number (with uppercase letters).
*/

function sprintf()
{
    var args = arguments;
    var frmt = arguments[0].replace(/%%/g, "\0\0");
    var result = "", prev = 0, index = 0;
    var re = /%(\d+[\$#])?([+-])?('.|0| )?(\d*)(\.\d*)?([bcdfosuxX])/g;
    /*
    * The re.exec() method returns the array with the following properties
    * witch are used in this function
    *    x.index contains the substring position found at the origin string
    *    x[0] contains the found substring
    *    x[1] contains the index specifier (as \d+\$ or \d+#)
    *    x[2] contains the alignment specifier ("+" or "-" or empty)
    *    x[3] contains the padding specifier (space char, "0" or defined as '
.)
    *    x[4] contains the width specifier (as \d*)
    *    x[5] contains the floating-point precision specifier (as \.\d*)
    *    x[6] contains the type specifier (as [bcdfosuxX])
    */
    while (x = re.exec(frmt)) {
        index++;
        if (x[1]) var ins = args[x[1].substring(0, x[1].length - 1)];
        else var ins = args[index];
        switch (x[6]) {
        case "b":
            ins = Number(ins).toString(2);
            break;
        case "c":
            ins = String.fromCharCode(ins);
            break;
        case "d":
        case "u":
            ins = Number(ins).toString(10);
            break;
        case "f":
            ins = Number(ins);
            if (x[5].length > 1) ins = ins.toFixed(x[5].substr(1));
            else ins = ins.toExponential(x[4]);
            break;
        case "o":
            ins = Number(ins).toString(8);
            break;
        case "s":
            ins = ins.toString();
            break;
        case "x":
            ins = Number(ins).toString(16);
            break;
        case "X":
            ins = Number(ins).toString(16).toUpperCase();
            break;
        }
        result += frmt.substring(prev, x.index);
        prev = x.index + x[0].length;
        if (!x[3]) x[3] = "";
        result += ins.padding(x[2] + x[4], x[3].substr(x[3].length - 1));
    }
    if (prev < frmt.length) result += frmt.substr(prev);
    result = result.replace(/\0\0/g, "%");
    return result;
}
пример (заимствован с php.net/sprintf, так же как и подробное описание)
Code (JavaScript): скопировать код в буфер обмена
format = "The %2\$s contains %1\$d monkeys";
var s = sprintf(format, 5, "tree"); // s == "The tree contains 5 monkeys"
var s = sprintf(format, "tree", 5); // s == "The 5 contains NaN monkeys"
 
небольшие проблемы представления числовой информации (хотя все достаточно логично):
Code (JavaScript): скопировать код в буфер обмена
var s = sprintf("%010d", -1); // s == "00000000-1"
var s = sprintf("%010X", -1); // s == "00000000-1"
 
обсуждения ведите в разделе Разное :: JavaScript (forum.dklab.ru/js/other/) со ссылкой на эту тему
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Sat Sep 04, 2004 4:22 pm (спустя 21 день 9 часов 4 минуты)
   Post subject: дополнительные функции представления целых чисел
Reply with quote

Code (JavaScript): скопировать код в буфер обмена
// The number converting functions
Number.prototype.radix = function(r, n, c)
{
    if (!c) c = '0';
    return this.toString(r).padding(n, c);
}

Number.prototype.bin = function(n, c)
{
    return this.radix(0x02, (n) ? n : 16, c);
}

Number.prototype.oct = function(n, c)
{
    return this.radix(0x08, (n) ? n : 6, c);
}

Number.prototype.dec = function(n, c)
{
    return this.radix(0x0A, (n) ? n : 2, c);
}

Number.prototype.hexl = function(n, c)
{
    return this.radix(0x10, (n) ? n : 4, c);
}

Number.prototype.hex = function(n, c)
{
    if (!c) c = '0';
    return this.hexl().toUpperCase().padding(n, c);
}
описание
n - ширина поля
c - символ заполнитель, по умолчанию 0
пример
Code (JavaScript): скопировать код в буфер обмена
var s = 250;
document.writeln([s, s.bin(), s.oct(), s.dec(), s.hexl(), s.hex()]);
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Sat Sep 04, 2004 4:30 pm (спустя 7 минут; написано за 44 секунды)
   Post subject:
Reply with quote

в связи с последним постом, переработал функцию sprintf и исправил некоторые ошибки, возникавшие с использованим в Опере.

теперь все одним файлом


Globals.zip
 Description:
полезные строковые функции

Download
 Filename:  Globals.zip
 Filesize:  3.1 KB
 Downloaded:  1268 Time(s)



Last edited by Rumata on Mon Jul 10, 2006 7:49 am; edited 4 times in total
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Tue Oct 12, 2004 11:18 pm (спустя 1 месяц 8 дней 6 часов 48 минут; написано за 4 минуты 29 секунд)
   Post subject:
Reply with quote

дополнения и исправления:
1. расширил функции validBrackets/bracketize/unbracketize для поддержки двухсимвольных скобок <??> /**/ <%%> (**)
2. исправил незамеченный ранее ляп в методах - String.prototype.padding/String.prototype.leftPad/String.prototype.rightPad
   некорректно осуществлялось выравнивание по левому/правому краю при значениях ширины поля меньше нуля
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Jul 05, 2006 1:12 pm (спустя 1 год 8 месяцев 23 дня 13 часов 54 минуты; написано за 6 минут 52 секунды)
   Post subject:
Reply with quote

в связи с обсуждением, инициированным автором темы Расширения объекта Date (forum.dklab.ru/js/advises/RasshireniyaObektaDate.html),
были выявлены существенные неточности в работе методов leftPad/rightPad

"перезалил" обновленный архив

немного изменил именование этих методов
padLeft - заполнить слева, аналог padding( n < 0 )
padRight - заполнить справа, аналог padding( n > 0 )

дополнение
alignLeft - выровнять влево
alignRight - выровнять вправо

методы bracketize/unbracketize "ушли" в прототип объекта String,
функция validBrackets стала одноименным статическим методом объекта String
Back to top
View user's profile Send private message
DizzZ
Участник форума



Joined: 23 Jan 2006
Posts: 154
Карма: 8
   поощрить/наказать


PostPosted: Wed Jul 05, 2006 7:23 pm (спустя 6 часов 11 минут; написано за 4 минуты 27 секунд)
   Post subject:
Reply with quote

метод repeat, безусловно, нужен (много где может пригодится)
но, мне кажется, писать его рекурсивно - это такое же кощунство, как писать рекурсивно факториал.
Покскольку известно что...
1. Рекурсия кушает много памяти. Особено в скриптовых языках.
2. Любое рекурсивное решение можно представить итеративно и наоборот.
Мне кажется, тут неразумно применять рекурсию (потому что есть смысл ее применять в основном на данных, которые рекурсивны по свое природе: деревья, фракталы, разбор выражений и т.д.).
Итеративный вариант настолько прост, что писать его тут не вижу смысла - это каждый сможет.
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Thu Jul 06, 2006 5:53 pm (спустя 22 часа 29 минут; написано за 57 секунд)
   Post subject:
Reply with quote

опять обновил архив
исправил одну неточность в Number.prototype.radix
добавил (наконец-то!) комментарии
Back to top
View user's profile Send private message
DizzZ
Участник форума



Joined: 23 Jan 2006
Posts: 154
Карма: 8
   поощрить/наказать


PostPosted: Wed Aug 30, 2006 1:01 am (спустя 1 месяц 23 дня 7 часов 7 минут; написано за 1 минуту 35 секунд)
   Post subject:
Reply with quote

мне кажется, очень полезно было бы добавить расширение для регэксповых функций, позволяющее искать с определенной позиции.
А то для indexOf такое есть, а для регэксповых функций нет (а надо).
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Wed Aug 30, 2006 10:53 am (спустя 9 часов 51 минуту; написано за 18 секунд)
   Post subject:
Reply with quote

DizzZ

А substring для строки не подойдёт?
Back to top
View user's profile Send private message
DizzZ
Участник форума



Joined: 23 Jan 2006
Posts: 154
Карма: 8
   поощрить/наказать


PostPosted: Thu Aug 31, 2006 12:42 am (спустя 13 часов 49 минут; написано за 1 минуту 42 секунды)
   Post subject:
Reply with quote

хотелось бы иметь нечто более удобное
т.е. готовые методы для поиска/замены по шаблону, начиная с заданной позиции
я понимаю, что это все несложно, просто хотел предложить дополнение к этому удобному набору расширений для строк
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Thu Aug 31, 2006 8:05 am (спустя 7 часов 23 минуты; написано за 4 минуты 53 секунды)
   Post subject:
Reply with quote

DizzZ, не совсем понял
эта библиотека писалась исходя из текущих потребностей, и дополнялась и обрастала дополнительным функционалом в процессе использования.
расширения функционала не планируется - с моей точки зрения, функционал библиотеки достаточен.
если это будет необходимо, Вы можете добавить требуемый функционал.
если функционал действительно важен и необходим я могу добавить :) с Вашими копирайтами
Back to top
View user's profile Send private message
DizzZ
Участник форума



Joined: 23 Jan 2006
Posts: 154
Карма: 8
   поощрить/наказать


PostPosted: Thu Aug 31, 2006 4:02 pm (спустя 7 часов 56 минут; написано за 43 секунды)
   Post subject:
Reply with quote

обязательно напишу эти методы, как только закончу с текущим проектом - мне эти функции нужны в следующем проекте :)
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Tue Feb 09, 2010 5:46 pm (спустя 3 года 5 месяцев 9 дней 1 час 44 минуты)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Функция для работы с географическими координатами»,
расположенную в форуме Разное :: JavaScript (09 Февраля 2010, 20:46).
Back to top
View user's profile Send private message Send e-mail
mary123
Заглянувший



Joined: 31 Dec 2010
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Mon Jan 03, 2011 11:48 am (спустя 10 месяцев 21 день 18 часов 1 минуту; написано за 5 секунд)
   Post subject:
Reply with quote

привет всем!
  IsNaN прекрасно работает с той же целью! он вернется относится к вещи, как 20а, A20, 20.a, 20а. и др. вернет ложное на 20, 20,1 и любой другой номер. Он работает в IE, насколько я знаю.
regerds.....
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML