regex - إدراج الفواصل في سلسلة رقم




5 Answers

إذا كانت لغتك تدعم تأكيدات lookahead postive ، فأعتقد أن التعبير المعتاد التالي سيعمل:

(\d)(?=(\d{3})+$)

أظهر في جافا:

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class CommifyTest {

    @Test
    public void testCommify() {
        String num0 = "1";
        String num1 = "123456";
        String num2 = "1234567";
        String num3 = "12345678";
        String num4 = "123456789";

        String regex = "(\\d)(?=(\\d{3})+$)";

        assertEquals("1", num0.replaceAll(regex, "$1,"));
        assertEquals("123,456", num1.replaceAll(regex, "$1,"));
        assertEquals("1,234,567", num2.replaceAll(regex, "$1,"));
        assertEquals("12,345,678", num3.replaceAll(regex, "$1,"));
        assertEquals("123,456,789", num4.replaceAll(regex, "$1,"));    
    }    
}

link التالي يقترح AS3 يفعل؟

مهلا ، أحاول إجراء بحث تعبير عادي إلى الوراء على سلسلة لتقسيمها إلى مجموعات مكونة من 3 أرقام. بقدر ما أستطيع أن أرى من documentation AS3 ، لا يمكن البحث في الوراء في المحرك السابق.

الهدف من هذا التمرين هو إدخال فواصل ثلاثية في شكل مثل:

10000000 => 10,000,000

أفكر في القيام بذلك على النحو التالي:

string.replace(/(\d{3})/g, ",$1")

ولكن هذا ليس صحيحًا نظرًا لأن البحث لا يحدث من الظهر وسيعمل استبدال $ 1 فقط على المباراة الأولى.

أحصل على الشعور بأنني أفضل من أداء هذه المهمة باستخدام حلقة.

تحديث:

بسبب AS3 لا تدعم lookahead هذه هي الطريقة التي حللت بها.

public static function formatNumber(number:Number):String
{
    var numString:String = number.toString()
    var result:String = ''

    while (numString.length > 3)
    {
        var chunk:String = numString.substr(-3)
        numString = numString.substr(0, numString.length - 3)
        result = ',' + chunk + result
    }

    if (numString.length > 0)
    {
        result = numString + result
    }

    return result
}



إذا كان لديك محرك regex يحتوي على lookaheads إيجابية ، يمكنك القيام بشيء من هذا القبيل:

string.replace(/(\d)(?=(\d\d\d)+$)/, "$1,")

حيث أن lookahead الإيجابي (؟ = ...) يعني أن التعبير العادي يتطابق فقط عندما يتطابق التعبير lookahead ....

(لاحظ أن تعبيرات البحث ليست دائمًا فعالة جدًا).




هذا في الحقيقة ليس أفضل استخدام لـ RegEx ... أنا لست على علم بوظيفة تنسيق الأرقام ، ولكن يبدو أن هذا الخيط يوفر حلاً.

function commaCoder(yourNum):String {
    //var yourNum:Number = new Number();
    var numtoString:String = new String();
    var numLength:Number = yourNum.toString().length;
    numtoString = "";

    for (i=0; i<numLength; i++) { 
        if ((numLength-i)%3 == 0 && i != 0) {
            numtoString += ",";
        }
        numtoString += yourNum.toString().charAt(i);
        trace(numtoString);
    }
    return numtoString;
}

إذا كنت حقا تصر على استخدام RegEx ، يمكنك فقط عكس السلسلة ، وتطبيق وظيفة استبدال RegEx ، ثم عكسها مرة أخرى.




قد ترغب في النظر في NumberFormatter




إذا كنت لا تستطيع استخدام lookahead على التعبيرات العادية ، يمكنك استخدام هذا:

string.replace(/^(.*?,)?(\d{1,3})((?:\d{3})+)$/, "$1$2,$3")

داخل حلقة حتى لا يكون هناك شيء لاستبداله.

على سبيل المثال ، قد يبدو الحل البديل كالتالي:

my $num = '1234567890';
while ($num =~ s/^(.*?,)?(\d{1,3})((?:\d{3})+)$/$1$2,$3/) {}



Related

regex actionscript-3