PDA

Просмотр полной версии : Разрешить только 1 пробел


deman455
30.01.2010, 22:24
Как такое сделать ?

Добавлено через 30 секунд
Что бы в инпут поле между словами можно было только один пробел

silin
30.01.2010, 22:41
tf.onChanged = function()
{
this.text = this.text.split(" ").join(" ");
}

udaaff
30.01.2010, 22:48
silin, а если сразу четыре пробела влепить? :) Больше двух, одним словом.

fessor
30.01.2010, 22:56
в уже написанном тексте отыскать все двойные пробелы и заменить их на одинарные
повторять пока перестанут находится двойные пробелы

или отслеживать последние два символа в поле инпут, если оба пробелы то заменять на один

silin
30.01.2010, 22:58
ага, про копипаст не подумал
while(this.text.indexOf(" ")>-1) this.text = this.text.split(" ").join(" ");

wvxvw
30.01.2010, 23:42
var s:String = " a b c d e ";
var i:Number = 0;
var j:Number = s.length;
var c:String;
var buffer:Array/*String*/ = [];
var state:Boolean = true;
while (i < j)
{
c = s.charAt(i);
if (c == " ")
{
if (state)
{
state = false;
buffer.push(c);
}
}
else
{
state = true;
buffer.push(c);
}
i++;
}
trace("|" + buffer.join("") + "|");

Вообще-то, если производительность имеет значение, то, пожалуй, что так было бы лучше, но поди знай, что там будет медленнее и что быстрее + от количества последовательных пробелов зависит и т.д. Но вцелом, создавать и удалять временные массивы - не самый хороший подход...

EDIT:
var s:String = " a b c d e ";
var i:Number = 0;
var j:Number = s.length;
var c:String;
var buffer:Array/*String*/ = [];
var state:Boolean = true;
var start:Number = 0;

while (i < j)
{
c = s.charAt(i);
if (c == " " && start != i - 1)
{
buffer.push(s.substring(start, i));
start = i;
}
else if (c == " ") start++;
i++;
}
if (s.charAt(s.length - 1) == " ") buffer.push(" ");
trace("|" + buffer.join("") + "|");
Или как-нибудь так...

samana
30.01.2010, 23:51
Ну тогда и мой вариант:
text.onChanged = function() {
var a = this.text;

if (a.charAt(this.length - 2) == " " && a.charAt(this.length - 1) == " ") {
this.text = a.slice(0, a.length - 1);
}

};

silin
30.01.2010, 23:57
ну канеш, думать о производительности надо всегда :)
но здесь-то инпут поле, разовая операция: в чем нужда оптимизировать? в чем выигрыш, кроме неочевидности кода?

wvxvw
31.01.2010, 00:19
Ну тогда и мой вариант:
text.onChanged = function() {
var a = this.text;

if (a.charAt(this.length - 2) == " " && a.charAt(this.length - 1) == " ") {
this.text = a.slice(0, a.length - 1);
}

};

Ну, а если копипаст? :)

ну канеш, думать о производительности надо всегда :)
но здесь-то инпут поле, разовая операция: в чем нужда оптимизировать? в чем выигрыш, кроме неочевидности кода?

Ну, код не обязан быть неочевидным, его можно потом аккуратно упаковать в функцию типа StringUtils.removeWhite( input : String ) : String и использовать не только для текстового поля :)

Просто мне тут недавно попался (в нашей же конторе) один "мастер яваскрипта и копипаста международного класса", и этот милый человек скопировал из какого-то индейского туториала функцию проверки строки на возможность конвертации в число... как бы функция не всегда работала, и вообще в туториале была только ради примера... но, как обычно, она была применена для валидации суммы в $$ в форме покупки чего-то на нашем же сайте :-) слава богу у нас никто ничего никогда купить не пытался :-)
Так я это к тому, что лучше написать так, чтобы ультимативно на все случаи жизни, чем потом циллиндрический гроб заказывать :-)

samana
31.01.2010, 00:39
Ну, а если копипаст?
Да, тут уже не сработает, вы правы.