2016-09-14 2 views
0

У меня есть еще один вопрос о lua. Я создал метод для вычисления общей суммы некоторых цен. Цены в этом формате: 500 фунтов стерлингов. Поэтому, чтобы преобразовать их в числа, я использую string: sub() и tonumber(), но я получаю некоторые странные результаты. Вот мой код: `Строка не работает правильно

function functions.calculateTotalAmount() 
print("calculating total amount") 
saveData.totalAmount = 0 
print("There are " .. #saveData.amounts .. " in the amount file") 
for i=1, #saveData.names do 
    print("SaveData.amounts[" .. i .. "] original = " .. saveData.amounts[i]) 
    print("SaveData.amounts[" .. i .. "] after sub= " .. saveData.amounts[i]:sub(2)) 
    print("totalAmount: " .. saveData.totalAmount) 
    if saveData.income[i] then 
     saveData.totalAmount = saveData.totalAmount + tonumber(saveData.amounts[i]:sub(2)) 
    else 
     saveData.totalAmount = saveData.totalAmount - tonumber(saveData.amounts[i]:sub(2)) 
    end 
end 
totalAmountStr.text = saveData.totalAmount .. " " .. currencyFull 
loadsave.saveTable(saveData, "payMeBackTable.json") 

конец

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

16: 03: 51.452 SaveData.amounts 1 оригинал = ¥ 201

16: 03: 51.452 SaveData.amounts 1 после суб = 201

Он выглядит отлично здесь, в stackoverflow, но для ¥ на самом деле не осталось в моем журнале, вместо этого он заменен странным символом прямоугольника. Будет напечатан текст, прикрепленный к этому сообщению. Кто-нибудь видит, что здесь происходит? enter image description here

ответ

1

Не используйте sub в этом случае, как ¥ знак, вероятно, последовательность многобайтный (в зависимости от кодировки) , поэтому используя sub(2), вы разрезаете его посередине, а не удаляете.

Используйте gsub("[^%d%.]+","") вместо этого, чтобы удалить все нечисловые детали.

+0

Это сработало для меня! Я предположил, что подфункция будет работать с этим символом, потому что она, похоже, работает со знаком доллара. Спасибо за помощь! –

0

string.sub() работает на байт строки, а не на ее гольцов. Есть разница, когда строка содержит текст в Юникоде.

Если число находится в конце строки, извлечь его с

amount = tonumber(saveData.amounts[i]:match("%d+$")) 
0

Строки Lua - это строки байты, а не строки символов. Символы ASCII имеют длину 1 байт, но большинство других символов потребляют несколько байтов, поэтому использование string.sub() не будет работать.

Есть несколько стандартов для преобразования между байтами и символами (или кодами точек), но на сегодняшний день наиболее распространенных в Интернете является UTF-8. Если вы используете Lua 5.3 или выше, вы можете использовать новый built-in functions для выполнения манипуляций UTF-8. Например, взять подстроку в строку UTF-8, вы можете сделать:

-- Simple version without bounds-checking. 
function utf8_sub1(s, start_char_idx, end_char_idx) 
    start_byte_idx = utf8.offset(s, start_char_idx) 
    end_byte_idx = utf8.offset(s, end_char_idx + 1) - 1 
    return string.sub(s, start_byte_idx, end_byte_idx) 
end 

-- More robust version with bounds-checking. 
function utf8_sub2(s, start_char_idx, end_char_idx) 
    start_byte_idx = utf8.offset(s, start_char_idx) 
    end_byte_idx = utf8.offset(s, end_char_idx + 1) 
    if start_byte_idx == nil then 
    start_byte_idx = 1 
    end 
    if end_byte_idx == nil then 
    end_byte_idx = -1 
    else 
    end_byte_idx = end_byte_idx - 1 
    end 
    return string.sub(s, start_byte_idx, end_byte_idx) 
end 

s = "¥201" 

print(string.sub(s, 2, 4)) -- an invalid byte sequence 
print(utf8_sub1(s, 2, 4)) -- "201" 
print(utf8_sub2(s, 2, 4)) -- "201" 
print(utf8_sub1(s, 2, 5)) -- throws an error 

Если вы не имеете Lua 5.3, вы можете использовать UTF-8 библиотека как this one вместо того, чтобы достичь той же функциональности ,

Смежные вопросы