strutils
Модуль system определяет несколько общих функций для работы со строками, таких как:
-
$для преобразования других типов данных в строки -
&для конкатенации строк -
addдля добавления нового символа или строки к существующей -
in(псевдоним дляcontains) иnotinдля проверки наличия символа в строке
Этот модуль расширяет это, предоставляя дополнительную функциональность в виде процедур, итераторов и шаблонов для строк.
import strutils
let
numbers = @[867, 5309]
multiLineString = "first line\nsecond line\nthird line"
let jenny = numbers.join("-")
assert jenny == "867-5309"
assert splitLines(multiLineString) ==
@["first line", "second line", "third line"]
assert split(multiLineString) == @["first", "line", "second",
"line", "third", "line"]
assert indent(multiLineString, 4) ==
" first line\n second line\n third line"
assert 'z'.repeat(5) == "zzzzz"
Цепочки функций возможны благодаря синтаксису вызова методов:
import strutils
from sequtils import map
let jenny = "867-5309"
assert jenny.split('-').map(parseInt) == @[867, 5309]
assert "Beetlejuice".indent(1).repeat(3).strip ==
"Beetlejuice Beetlejuice Beetlejuice"
Этот модуль доступен для цели JavaScript.
См. также:
- модуль strformat для интерполяции и форматирования строк
- модуль unicode для обработки Unicode UTF-8
- модуль sequtils для операций над контейнерными типами (включая строки)
- модуль parsecsv для высокопроизводительного парсера CSV
- модуль parseutils для низкоуровневого парсинга токенов, чисел, идентификаторов и т. д.
- модуль parseopt для парсинга командной строки
- модуль pegs для поддержки PEG (Parsing Expression Grammar)
- модуль strtabs для эффективных хеш-таблиц (словари в некоторых языках программирования), сопоставляющих строки со строками
- модуль ropes для типа данных rope, который может эффективно представлять очень длинные строки
- модуль re для поддержки регулярных выражений (regex)
-
strscans для
scanfиscanpмакросов, которые предлагают более простой способ извлечения подстрок, чем регулярные выражения
Импорты
- parseutils, math, algorithm, macros, unicode, since
Типы
SkipTable = array[char, int]
- Исходный код Изменить
FloatFormatMode = enum ffDefault, ## use the shorter floating point notation ffDecimal, ## use decimal floating point notation ffScientific ## use scientific notation (using ``e`` character)
- различные режимы форматирования чисел с плавающей точкой Исходный код Изменить
BinaryPrefixMode = enum bpIEC, bpColloquial
- различные имена двоичных префиксов Исходный код Изменить
Константы
Whitespace = {' ', '\t', '\v', '\c', '\n', '\f'}- Все символы, считающиеся пробелами (пробел, табуляция, вертикальная табуляция, возврат каретки, перевод строки, подача формы) Исходный код Изменить
Letters = {'A'..'Z', 'a'..'z'}- набор букв Исходный код Изменить
Digits = {'0'..'9'}- набор цифр Исходный код Изменить
HexDigits = {'0'..'9', 'A'..'F', 'a'..'f'}- набор шестнадцатеричных цифр Исходный код Изменить
IdentChars = {'a'..'z', 'A'..'Z', '0'..'9', '_'}- набор символов, из которых может состоять идентификатор Исходный код Изменить
IdentStartChars = {'a'..'z', 'A'..'Z', '_'}- набор символов, с которых может начинаться идентификатор Исходный код Изменить
Newlines = {'\c', '\n'}- набор символов, с которых может начинаться символ завершения новой строки (возврат каретки, перевод строки) Исходный код Изменить
AllChars = {'\x00'..'\xFF'}-
Набор со всеми возможными символами.
Не очень полезен сам по себе, вы можете использовать его для создания обратных наборов, чтобы заставить процедуру find искать недопустимые символы в строках. Пример:
let invalid = AllChars - Digits doAssert "01234".find(invalid) == -1 doAssert "01A34".find(invalid) == 2
Исходный код Изменить
Процедуры
proc isAlphaAscii(c: char): bool {...}{.noSideEffect, gcsafe, extern: "nsuIsAlphaAsciiChar", raises: [], tags: [].}-
Проверяет, является ли символ
cбуквенным.Проверяет только символы a-z, A-Z ASCII. Используйте модуль Unicode для поддержки UTF-8.
Пример:
doAssert isAlphaAscii('e') == true doAssert isAlphaAscii('E') == true doAssert isAlphaAscii('8') == falseИсходный код Изменить proc isAlphaNumeric(c: char): bool {...}{.noSideEffect, gcsafe, extern: "nsuIsAlphaNumericChar", raises: [], tags: [].}-
Проверяет, является ли
cбуквенно-цифровым.Проверяет только символы a-z, A-Z, 0-9 ASCII.
Пример:
doAssert isAlphaNumeric('n') == true doAssert isAlphaNumeric('8') == true doAssert isAlphaNumeric(' ') == falseИсходный код Изменить proc isDigit(c: char): bool {...}{.noSideEffect, gcsafe, extern: "nsuIsDigitChar", raises: [], tags: [].}-
Проверяет, является ли
cчислом.Проверяет только символы 0-9 ASCII.
Пример:
doAssert isDigit('n') == false doAssert isDigit('8') == trueИсходный код Изменить proc isSpaceAscii(c: char): bool {...}{.noSideEffect, gcsafe, extern: "nsuIsSpaceAsciiChar", raises: [], tags: [].}- Проверяет, является ли
cсимволом пробела.Пример:
doAssert isSpaceAscii('n') == false doAssert isSpaceAscii(' ') == true doAssert isSpaceAscii('\t') == trueИсходный код Изменить proc isLowerAscii(c: char): bool {...}{.noSideEffect, gcsafe, extern: "nsuIsLowerAsciiChar", raises: [], tags: [].}-
Проверяет, является ли
cсимволом строчных букв.Проверяет только ASCII символы. Используйте модуль Unicode для поддержки UTF-8.
См. также:
Пример:
doAssert isLowerAscii('e') == true doAssert isLowerAscii('E') == false doAssert isLowerAscii('7') == falseИсходный код Изменить proc isUpperAscii(c: char): bool {...}{.noSideEffect, gcsafe, extern: "nsuIsUpperAsciiChar", raises: [], tags: [].}-
Проверяет, является ли
cсимволом заглавных букв.Проверяет только ASCII символы. Используйте модуль Unicode для поддержки UTF-8.
См. также:
Пример:
doAssert isUpperAscii('e') == false doAssert isUpperAscii('E') == true doAssert isUpperAscii('7') == falseИсходный код Изменить proc toLowerAscii(c: char): char {...}{.noSideEffect, gcsafe, extern: "nsuToLowerAsciiChar", raises: [], tags: [].}-
Возвращает строчную версию символа
c.Работает только для букв
A-Z. См. unicode.toLower для версии, работающей с любым символом Юникода.См. также:
- процедуру isLowerAscii
- процедуру toLowerAscii для преобразования строки
Пример:
doAssert toLowerAscii('A') == 'a' doAssert toLowerAscii('e') == 'e'Исходный код Изменить proc toLowerAscii(s: string): string {...}{.noSideEffect, gcsafe, extern: "nsuToLowerAsciiStr", raises: [], tags: [].}-
Преобразует строку
sв строчные буквы.Работает только для букв
A-Z. См. unicode.toLower для версии, работающей с любым символом Юникода.См. также:
Пример:
doAssert toLowerAscii("FooBar!") == "foobar!"Исходный код Изменить proc toUpperAscii(c: char): char {...}{.noSideEffect, gcsafe, extern: "nsuToUpperAsciiChar", raises: [], tags: [].}-
Преобразует символ
cв заглавные буквы.Работает только для букв
A-Z. См. unicode.toUpper для версии, работающей с любым символом Юникода.См. также:
- процедуру isLowerAscii
- процедуру toUpperAscii для преобразования строки
- процедуру capitalizeAscii
Пример:
doAssert toUpperAscii('a') == 'A' doAssert toUpperAscii('E') == 'E'Исходный код Изменить proc toUpperAscii(s: string): string {...}{.noSideEffect, gcsafe, extern: "nsuToUpperAsciiStr", raises: [], tags: [].}-
Преобразует строку
sв заглавные буквы.Работает только для букв
A-Z. См. unicode.toUpper для версии, работающей с любым символом Юникода.См. также:
Пример:
doAssert toUpperAscii("FooBar!") == "FOOBAR!"Исходный код Изменить proc capitalizeAscii(s: string): string {...}{.noSideEffect, gcsafe, extern: "nsuCapitalizeAscii", raises: [], tags: [].}-
Преобразует первый символ строки
sв заглавные буквы.Работает только для букв
A-Z. Используйте модуль Unicode для поддержки UTF-8.См. также:
Пример:
doAssert capitalizeAscii("foo") == "Foo" doAssert capitalizeAscii("-bar") == "-bar"Исходный код Изменить proc nimIdentNormalize(s: string): string {...}{.raises: [], tags: [].}-
Нормализует строку
sкак имя идентификатора Nim.Это означает преобразование в нижний регистр и удаление всех '_' для всех символов, кроме первого.
Пример:
doAssert nimIdentNormalize("Foo_bar") == "Foobar"Исходный код Изменить proc normalize(s: string): string {...}{.noSideEffect, gcsafe, extern: "nsuNormalize", raises: [], tags: [].}-
Нормализует строку
s.Это означает преобразование в нижний регистр и удаление всех '_'. Это НЕ должно использоваться для нормализации имён идентификаторов Nim.
См. также:
Пример:
doAssert normalize("Foo_bar") == "foobar" doAssert normalize("Foo Bar") == "foo bar"Исходный код Изменить proc cmpIgnoreCase(a, b: string): int {...}{.noSideEffect, gcsafe, extern: "nsuCmpIgnoreCase", raises: [], tags: [].}- Сравнивает две строки без учета регистра. Возвращает:
0 если a == b
< 0 если a < b
> 0 если a > bПример:
doAssert cmpIgnoreCase("FooBar", "foobar") == 0 doAssert cmpIgnoreCase("bar", "Foo") < 0 doAssert cmpIgnoreCase("Foo5", "foo4") > 0Исходный код Изменить proc cmpIgnoreStyle(a, b: string): int {...}{.noSideEffect, gcsafe, extern: "nsuCmpIgnoreStyle", raises: [], tags: [].}-
Семантически идентично
cmp(normalize(a), normalize(b)). Просто оптимизировано для того, чтобы не выделять временные строки. НЕ должно использоваться для сравнения имён идентификаторов Nim. Используйте macros.eqIdent для этого.Возвращает:
0 если a == b
< 0 если a < b
> 0 если a > bПример:
doAssert cmpIgnoreStyle("foo_bar", "FooBar") == 0 doAssert cmpIgnoreStyle("foo_bar_5", "FooBar4") > 0Исходный код Изменить proc split(s: string; sep: char; maxsplit: int = -1): seq[string] {...}{. noSideEffect, gcsafe, extern: "nsuSplitChar", raises: [], tags: [].}-
То же самое, что и итератор split (см. его документацию), но является процедурой, возвращающей последовательность подстрок.
См. также:
Пример:
doAssert "a,b,c".split(',') == @["a", "b", "c"] doAssert "".split(' ') == @[""]Исходный код Изменить proc split(s: string; seps: set[char] = Whitespace; maxsplit: int = -1): seq[ string] {...}{.noSideEffect, gcsafe, extern: "nsuSplitCharSet", raises: [], tags: [].}-
То же самое, что и итератор split (см. его документацию), но является процедурой, возвращающей последовательность подстрок.
См. также:
Пример:
doAssert "a,b;c".split({',', ';'}) == @["a", "b", "c"] doAssert "".split({' '}) == @[""]Исходный код Изменить proc split(s: string; sep: string; maxsplit: int = -1): seq[string] {...}{. noSideEffect, gcsafe, extern: "nsuSplitString", raises: [], tags: [].}-
Разделяет строку
sна подстроки с использованием разделителя-строки.Подстроки разделяются строкой
sep. Это обёртка вокруг итератора split.См. также:
Пример:
doAssert "a,b,c".split(",") == @["a", "b", "c"] doAssert "a man a plan a canal panama".split("a ") == @["", "man ", "plan ", "canal panama"] doAssert "".split("Elon Musk") == @[""] doAssert "a largely spaced sentence".split(" ") == @["a", "", "largely", "", "", "", "spaced", "sentence"] doAssert "a largely spaced sentence".split(" ", maxsplit = 1) == @["a", " largely spaced sentence"]Исходный код Изменить proc rsplit(s: string; sep: char; maxsplit: int = -1): seq[string] {...}{. noSideEffect, gcsafe, extern: "nsuRSplitChar", raises: [], tags: [].}
-
То же самое, что и итератор rsplit, но это процедура, которая возвращает последовательность подстрок.
Возможный распространённый случай использования
rsplit— обработка путей, особенно на системах, которые не используют общий разделитель.Например, если система использует
#в качестве разделителя, вы можете сделать следующее, чтобы получить хвост пути:var tailSplit = rsplit("Root#Object#Method#Index", '#', maxsplit=1)В результате в
tailSplitбудет содержаться:@["Root#Object#Method", "Index"]
См. также:
Исходный код Редактировать proc rsplit(s: string; seps: set[char] = Whitespace; maxsplit: int = -1): seq[ string] {...}{.noSideEffect, gcsafe, extern: "nsuRSplitCharSet", raises: [], tags: [].}-
То же самое, что и итератор rsplit, но это процедура, которая возвращает последовательность подстрок.
Возможный распространённый случай использования
rsplit— обработка путей, особенно на системах, которые не используют общий разделитель.Например, если система использует
#в качестве разделителя, вы можете сделать следующее, чтобы получить хвост пути:var tailSplit = rsplit("Root#Object#Method#Index", {'#'}, maxsplit=1)В результате в
tailSplitбудет содержаться:@["Root#Object#Method", "Index"]
См. также:
Исходный код Редактировать proc rsplit(s: string; sep: string; maxsplit: int = -1): seq[string] {...}{. noSideEffect, gcsafe, extern: "nsuRSplitString", raises: [], tags: [].}-
То же самое, что и итератор rsplit, но это процедура, которая возвращает последовательность подстрок.
Возможный распространённый случай использования
rsplit— обработка путей, особенно на системах, которые не используют общий разделитель.Например, если система использует
#в качестве разделителя, вы можете сделать следующее, чтобы получить хвост пути:var tailSplit = rsplit("Root#Object#Method#Index", "#", maxsplit=1)В результате в
tailSplitбудет содержаться:@["Root#Object#Method", "Index"]
См. также:
Пример:
doAssert "a largely spaced sentence".rsplit(" ", maxsplit = 1) == @[ "a largely spaced", "sentence"] doAssert "a,b,c".rsplit(",") == @["a", "b", "c"] doAssert "a man a plan a canal panama".rsplit("a ") == @["", "man ", "plan ", "canal panama"] doAssert "".rsplit("Elon Musk") == @[""] doAssert "a largely spaced sentence".rsplit(" ") == @["a", "", "largely", "", "", "", "spaced", "sentence"]Исходный код Редактировать proc splitLines(s: string; keepEol = false): seq[string] {...}{.noSideEffect, gcsafe, extern: "nsuSplitLines", raises: [], tags: [].}-
То же самое, что и итератор splitLines (см. его документацию), но это процедура, которая возвращает последовательность подстрок.
См. также:
Исходный код Редактировать proc splitWhitespace(s: string; maxsplit: int = -1): seq[string] {...}{.noSideEffect, gcsafe, extern: "nsuSplitWhitespace", raises: [], tags: [].}-
То же самое, что и итератор splitWhitespace (см. его документацию), но это процедура, которая возвращает последовательность подстрок.
См. также:
Исходный код Редактировать proc toBin(x: BiggestInt; len: Positive): string {...}{.noSideEffect, gcsafe, extern: "nsuToBin", raises: [], tags: [].}-
Преобразует
xв его двоичное представление.Полученная строка всегда имеет длину
lenсимволов. Не генерируется префикс0b.Пример:
let a = 29 b = 257 doAssert a.toBin(8) == "00011101" doAssert b.toBin(8) == "00000001" doAssert b.toBin(9) == "100000001"
Исходный код Редактировать proc toOct(x: BiggestInt; len: Positive): string {...}{.noSideEffect, gcsafe, extern: "nsuToOct", raises: [], tags: [].}-
Преобразует
xв его восьмеричное представление.Полученная строка всегда имеет длину
lenсимволов. Не генерируется префикс0o.Не путайте с процедурой toOct.
Пример:
let a = 62 b = 513 doAssert a.toOct(3) == "076" doAssert b.toOct(3) == "001" doAssert b.toOct(5) == "01001"
Исходный код Редактировать proc toHex[T: SomeInteger](x: T; len: Positive): string {...}{.noSideEffect.}-
Преобразует
xв его шестнадцатеричное представление.Полученная строка будет иметь ровно
lenсимволов. Не генерируется префикс, например0x.xрассматривается как беззнаковое значение.Пример:
let a = 62'u64 b = 4097'u64 doAssert a.toHex(3) == "03E" doAssert b.toHex(3) == "001" doAssert b.toHex(4) == "1001" doAssert toHex(62, 3) == "03E" doAssert toHex(-8, 6) == "FFFFF8"
Исходный код Редактировать proc toHex[T: SomeInteger](x: T): string {...}{.noSideEffect.}- Сокращение для
toHex(x, T.sizeof * 2)Пример:
doAssert toHex(1984'i64) == "00000000000007C0" doAssert toHex(1984'i16) == "07C0"
Исходный код Редактировать proc toHex(s: string): string {...}{.noSideEffect, gcsafe, raises: [], tags: [].}-
Преобразует строку байтов в её шестнадцатеричное представление.
Выходная строка имеет вдвое большую длину, чем входная. Не генерируется префикс, например
0x.См. также:
- процедуру parseHexStr для обратной операции
Пример:
let a = "1" b = "A" c = "\0\255" doAssert a.toHex() == "31" doAssert b.toHex() == "41" doAssert c.toHex() == "00FF"
Исходный код Редактировать proc toOctal(c: char): string {...}{.noSideEffect, gcsafe, extern: "nsuToOctal", raises: [], tags: [].}-
Преобразует символ
cв его восьмеричное представление.Полученная строка может не иметь ведущего нуля. Её длина всегда равна ровно 3.
Не путайте с процедурой toOct.
Пример:
doAssert toOctal('1') == "061" doAssert toOctal('A') == "101" doAssert toOctal('a') == "141" doAssert toOctal('!') == "041"Исходный код Редактировать proc fromBin[T: SomeInteger](s: string): T
-
Парсит двоичное целое значение из строки
s.Если
sне является допустимым двоичным целым числом, возбуждаетсяValueError.sможет иметь один из следующих необязательных префиксов:0b,0B. Подчеркивания вsигнорируются.Не проверяет переполнение. Если значение, представленное
s, слишком велико для типа возвращаемого значения, возвращается только значение самых правых двоичных цифрsбез выдачи ошибки.Пример:
let s = "0b_0100_1000_1000_1000_1110_1110_1001_1001" doAssert fromBin[int](s) == 1216933529 doAssert fromBin[int8](s) == 0b1001_1001'i8 doAssert fromBin[int8](s) == -103'i8 doAssert fromBin[uint8](s) == 153 doAssert s.fromBin[:int16] == 0b1110_1110_1001_1001'i16 doAssert s.fromBin[:uint64] == 1216933529'u64
Исходный код Редактировать proc fromOct[T: SomeInteger](s: string): T
-
Парсит восьмеричное целое значение из строки
s.Если
sне является допустимым восьмеричным целым числом, возбуждаетсяValueError.sможет иметь один из следующих необязательных префиксов:0o,0O. Подчеркивания вsигнорируются.Не проверяет переполнение. Если значение, представленное
s, слишком велико для типа возвращаемого значения, возвращается только значение самых правых восьмеричных цифрsбез выдачи ошибки.Пример:
let s = "0o_123_456_777" doAssert fromOct[int](s) == 21913087 doAssert fromOct[int8](s) == 0o377'i8 doAssert fromOct[int8](s) == -1'i8 doAssert fromOct[uint8](s) == 255'u8 doAssert s.fromOct[:int16] == 24063'i16 doAssert s.fromOct[:uint64] == 21913087'u64
Исходный код Редактировать proc fromHex[T: SomeInteger](s: string): T
-
Парсит шестнадцатеричное целое значение из строки
s.Если
sне является допустимым шестнадцатеричным целым числом, возбуждаетсяValueError.sможет иметь один из следующих необязательных префиксов:0x,0X,#. Подчеркивания вsигнорируются.Не проверяет переполнение. Если значение, представленное
s, слишком велико для типа возвращаемого значения, возвращается только значение самых правых шестнадцатеричных цифрsбез выдачи ошибки.Пример:
let s = "0x_1235_8df6" doAssert fromHex[int](s) == 305499638 doAssert fromHex[int8](s) == 0xf6'i8 doAssert fromHex[int8](s) == -10'i8 doAssert fromHex[uint8](s) == 246'u8 doAssert s.fromHex[:int16] == -29194'i16 doAssert s.fromHex[:uint64] == 305499638'u64
Исходный код Редактировать proc intToStr(x: int; minchars: Positive = 1): string {...}{.noSideEffect, gcsafe, extern: "nsuIntToStr", raises: [], tags: [].}-
Преобразует
xв его десятичное представление.Полученная строка будет иметь минимальную длину
mincharsсимволов. Это достигается путём добавления ведущих нулей.Пример:
doAssert intToStr(1984) == "1984" doAssert intToStr(1984, 6) == "001984"
Исходный код Редактировать proc parseInt(s: string): int {...}{.noSideEffect, gcsafe, extern: "nsuParseInt", raises: [ValueError], tags: [].}
-
Парсит целое десятичное значение, содержащееся в
s.Если
sне является допустимым целым числом, генерируетсяValueError.Пример:
doAssert parseInt("-0042") == -42Исходный код Редактировать proc parseBiggestInt(s: string): BiggestInt {...}{.noSideEffect, gcsafe, extern: "nsuParseBiggestInt", raises: [ValueError], tags: [].}-
Парсит целое десятичное значение, содержащееся в
s.Если
Исходный код Редактироватьsне является допустимым целым числом, генерируетсяValueError. proc parseUInt(s: string): uint {...}{.noSideEffect, gcsafe, extern: "nsuParseUInt", raises: [ValueError], tags: [].}-
Парсит целое десятичное беззнаковое значение, содержащееся в
s.Если
Исходный код Редактироватьsне является допустимым целым числом, генерируетсяValueError. proc parseBiggestUInt(s: string): BiggestUInt {...}{.noSideEffect, gcsafe, extern: "nsuParseBiggestUInt", raises: [ValueError], tags: [].}-
Парсит целое десятичное беззнаковое значение, содержащееся в
s.Если
Исходный код Редактироватьsне является допустимым целым числом, генерируетсяValueError. proc parseFloat(s: string): float {...}{.noSideEffect, gcsafe, extern: "nsuParseFloat", raises: [ValueError], tags: [].}-
Парсит значение с плавающей запятой в десятичном формате, содержащееся в
s.Если
sне является допустимым числом с плавающей запятой, генерируетсяValueError. Также поддерживаютсяNAN,INF,-INF(регистронезависимое сравнение).Пример:
doAssert parseFloat("3.14") == 3.14 doAssert parseFloat("inf") == 1.0/0Исходный код Редактировать proc parseBinInt(s: string): int {...}{.noSideEffect, gcsafe, extern: "nsuParseBinInt", raises: [ValueError], tags: [].}-
Парсит двоичное целое значение, содержащееся в
s.Если
sне является допустимым двоичным целым числом, генерируетсяValueError.sможет иметь один из следующих необязательных префиксов:0b,0B. Подчеркивания вsигнорируются.Пример:
let a = "0b11_0101" b = "111" doAssert a.parseBinInt() == 53 doAssert b.parseBinInt() == 7
Исходный код Редактировать proc parseOctInt(s: string): int {...}{.noSideEffect, gcsafe, extern: "nsuParseOctInt", raises: [ValueError], tags: [].}-
Парсит восьмеричное целое значение, содержащееся в
s.Если
Исходный код Редактироватьsне является допустимым восьмеричным целым числом, генерируетсяValueError.sможет иметь один из следующих необязательных префиксов:0o,0O. Подчеркивания вsигнорируются. proc parseHexInt(s: string): int {...}{.noSideEffect, gcsafe, extern: "nsuParseHexInt", raises: [ValueError], tags: [].}-
Парсит шестнадцатеричное целое значение, содержащееся в
s.Если
Исходный код Редактироватьsне является допустимым шестнадцатеричным целым числом, генерируетсяValueError.sможет иметь один из следующих необязательных префиксов:0x,0X,#. Подчеркивания вsигнорируются. proc parseHexStr(s: string): string {...}{.noSideEffect, gcsafe, extern: "nsuParseHexStr", raises: [ValueError], tags: [].}-
Преобразует шестнадцатеричную строку в строку байтов, например:
Вызывает
ValueErrorдля недопустимых шестнадцатеричных значений. Сравнение регистронезависимое.См. также:
- toHex proc для обратной операции
Пример:
let a = "41" b = "3161" c = "00ff" doAssert parseHexStr(a) == "A" doAssert parseHexStr(b) == "1a" doAssert parseHexStr(c) == "\0\255"
Исходный код Редактировать proc parseBool(s: string): bool {...}{.raises: [ValueError], tags: [].}-
Парсит значение в
bool.Если
sравно одному из следующих значений:y, yes, true, 1, on, возвращаетtrue. Еслиsравно одному из следующих значений:n, no, false, 0, off, возвращаетfalse. В противном случае генерируется исключениеValueError.Пример:
let a = "n" doAssert parseBool(a) == false
Исходный код Редактировать proc parseEnum[T: enum](s: string): T
-
Парсит перечисление
T. Возникает ошибка во время компиляции, если данный тип перечисления содержит несколько полей с одинаковым строковым значением.Генерирует
ValueErrorдля недопустимого значения вs. Сравнение выполняется регистронезависимым способом.Пример:
type MyEnum = enum first = "1st", second, third = "3rd" doAssert parseEnum[MyEnum]("1_st") == first doAssert parseEnum[MyEnum]("second") == second doAssertRaises(ValueError): echo parseEnum[MyEnum]("third")Исходный код Редактировать proc parseEnum[T: enum](s: string; default: T): T
-
Парсит перечисление
T. Возникает ошибка во время компиляции, если данный тип перечисления содержит несколько полей с одинаковым строковым значением.Использует
defaultдля недопустимого значения вs. Сравнение выполняется регистронезависимым способом.Пример:
type MyEnum = enum first = "1st", second, third = "3rd" doAssert parseEnum[MyEnum]("1_st") == first doAssert parseEnum[MyEnum]("second") == second doAssert parseEnum[MyEnum]("last", third) == thirdИсходный код Редактировать proc repeat(c: char; count: Natural): string {...}{.noSideEffect, gcsafe, extern: "nsuRepeatChar", raises: [], tags: [].}- Возвращает строку длиной
count, состоящую только из символаc.Пример:
let a = 'z' doAssert a.repeat(5) == "zzzzz"
Исходный код Редактировать proc repeat(s: string; n: Natural): string {...}{.noSideEffect, gcsafe, extern: "nsuRepeatStr", raises: [], tags: [].}- Возвращает строку
s, конкатенированнуюnраз.Пример:
doAssert "+ foo +".repeat(3) == "+ foo ++ foo ++ foo +"
Исходный код Редактировать proc spaces(n: Natural): string {...}{.inline, raises: [], tags: [].}-
Возвращает строку с
nпробелами. Эта процедура может быть использована для выравнивания строк по левому краю.См. также:
Пример:
let width = 15 text1 = "Hello user!" text2 = "This is a very long string" doAssert text1 & spaces(max(0, width - text1.len)) & "|" == "Hello user! |" doAssert text2 & spaces(max(0, width - text2.len)) & "|" == "This is a very long string|"Исходный код Редактировать proc align(s: string; count: Natural; padding = ' '): string {...}{.noSideEffect, gcsafe, extern: "nsuAlignString", raises: [], tags: [].}-
Выравнивает строку
sпо правому краю сpadding, так чтобы ее длина былаcount.Перед
sдобавляются символы (по умолчанию пробелы), что приводит к правому выравниванию. Еслиs.len >= count, пробелы не добавляются, иsвозвращается без изменений. Для левого выравнивания используйте alignLeft proc.См. также:
Пример:
assert align("abc", 4) == " abc" assert align("a", 0) == "a" assert align("1232", 6) == " 1232" assert align("1232", 6, '#') == "##1232"Исходный код Редактировать proc alignLeft(s: string; count: Natural; padding = ' '): string {...}{.noSideEffect, raises: [], tags: [].}-
Выравнивает строку
sпо левому краю сpadding, так чтобы ее длина былаcount.После
sдобавляются символы (по умолчанию пробелы), что приводит к левому выравниванию. Еслиs.len >= count, пробелы не добавляются, иsвозвращается без изменений. Для правого выравнивания используйте align proc.См. также:
Пример:
assert alignLeft("abc", 4) == "abc " assert alignLeft("a", 0) == "a" assert alignLeft("1232", 6) == "1232 " assert alignLeft("1232", 6, '#') == "1232##"Исходный код Редактировать proc center(s: string; width: int; fillChar: char = ' '): string {...}{.noSideEffect, gcsafe, extern: "nsuCenterString", raises: [], tags: [].}
-
Возвращает содержимое
sцентрированным в строкеwidthдлиной, используяfillChar(по умолчанию: пробел) в качестве отступа.Исходная строка возвращается, если
widthменьше или равноs.len.См. также:
Пример:
let a = "foo" doAssert a.center(2) == "foo" doAssert a.center(5) == " foo " doAssert a.center(6) == " foo "
Исходный код Редактировать proc indent(s: string; count: Natural; padding: string = " "): string {...}{. noSideEffect, gcsafe, extern: "nsuIndent", raises: [], tags: [].}-
Отступает каждую строку в
sна величинуcountколичествоpadding.Примечание: Это не сохраняет символы новой строки, используемые в
s.См. также:
Пример:
doAssert indent("First line\c\l and second line.", 2) == " First line\l and second line."Исходный код Редактировать proc unindent(s: string; count: Natural = int.high; padding: string = " "): string {...}{. noSideEffect, gcsafe, extern: "nsuUnindent", raises: [], tags: [].}-
Убирает отступы каждой строки в
sна величинуcountколичествоpadding.Примечание: Это не сохраняет символы новой строки, используемые в
s.См. также:
Пример:
let x = """ Hello There """.unindent() doAssert x == "Hello\nThere\n"Исходный код Редактировать proc indentation(s: string): Natural {...}{.raises: [], tags: [].}- Возвращает количество общего отступа всех строк в
s, игнорируя строки, состоящие только из пробелов. Исходный код Редактировать proc dedent(s: string; count: Natural = indentation(s)): string {...}{.noSideEffect, gcsafe, extern: "nsuDedent", raises: [], tags: [].}-
Убирает отступы каждой строки в
sна величинуcountколичествоpadding. Единственное отличие от процедуры unindent заключается в том, что по умолчанию она обрезает только количество отступа, общее для всех строк вs, в отличие от всего отступа. Она поддерживает только пробелы в качестве отступа.Примечание: Это не сохраняет символы новой строки, используемые в
s.См. также:
Пример:
let x = """ Hello There """.dedent() doAssert x == "Hello\n There\n"Исходный код Редактировать proc delete(s: var string; first, last: int) {...}{.noSideEffect, gcsafe, extern: "nsuDelete", raises: [], tags: [].}-
Удаляет в
s(должен быть объявлен какvar) символы по позициямfirst ..last(включая оба конца).Это изменяет
sсамо по себе, оно не возвращает копию.Пример:
var a = "abracadabra" a.delete(4, 5) doAssert a == "abradabra" a.delete(1, 6) doAssert a == "ara" a.delete(2, 999) doAssert a == "ar"
Исходный код Редактировать proc startsWith(s: string; prefix: char): bool {...}{.noSideEffect, inline, raises: [], tags: [].}-
Возвращает true, если
sначинается с символаprefix.См. также:
Пример:
let a = "abracadabra" doAssert a.startsWith('a') == true doAssert a.startsWith('b') == falseИсходный код Редактировать proc startsWith(s, prefix: string): bool {...}{.noSideEffect, gcsafe, extern: "nsuStartsWith", raises: [], tags: [].}-
Возвращает true, если
sначинается со строкиprefix.Если
prefix == ""true возвращается.См. также:
Пример:
let a = "abracadabra" doAssert a.startsWith("abra") == true doAssert a.startsWith("bra") == falseИсходный код Редактировать proc endsWith(s: string; suffix: char): bool {...}{.noSideEffect, inline, raises: [], tags: [].}-
Возвращает true, если
sзаканчивается наsuffix.См. также:
Пример:
let a = "abracadabra" doAssert a.endsWith('a') == true doAssert a.endsWith('b') == falseИсходный код Редактировать proc endsWith(s, suffix: string): bool {...}{.noSideEffect, gcsafe, extern: "nsuEndsWith", raises: [], tags: [].}-
Возвращает true, если
sзаканчивается наsuffix.Если
suffix == ""true возвращается.См. также:
Пример:
let a = "abracadabra" doAssert a.endsWith("abra") == true doAssert a.endsWith("dab") == falseИсходный код Редактировать proc continuesWith(s, substr: string; start: Natural): bool {...}{.noSideEffect, gcsafe, extern: "nsuContinuesWith", raises: [], tags: [].}-
Возвращает true, если
sпродолжает сsubstrв позицииstart.Если
substr == ""true возвращается.См. также:
Пример:
let a = "abracadabra" doAssert a.continuesWith("ca", 4) == true doAssert a.continuesWith("ca", 5) == false doAssert a.continuesWith("dab", 6) == trueИсходный код Редактировать proc removePrefix(s: var string; chars: set[char] = Newlines) {...}{.gcsafe, extern: "nsuRemovePrefixCharSet", raises: [], tags: [].}-
Удаляет все символы из
charsс начала строкиs(вместо копии).См. также:
Пример:
var userInput = "\r\n*~Hello World!" userInput.removePrefix doAssert userInput == "*~Hello World!" userInput.removePrefix({'~', '*'}) doAssert userInput == "Hello World!" var otherInput = "?!?Hello!?!" otherInput.removePrefix({'!', '?'}) doAssert otherInput == "Hello!?!"Исходный код Редактировать proc removePrefix(s: var string; c: char) {...}{.gcsafe, extern: "nsuRemovePrefixChar", raises: [], tags: [].}-
Удаляет все вхождения одного символа (вместо копии) с начала строки.
См. также:
Пример:
var ident = "pControl" ident.removePrefix('p') doAssert ident == "Control"Исходный код Редактировать proc removePrefix(s: var string; prefix: string) {...}{.gcsafe, extern: "nsuRemovePrefixString", raises: [], tags: [].}-
Удаляет первое совпадающее префиксное значение (вместо копии) из строки.
См. также:
Пример:
var answers = "yesyes" answers.removePrefix("yes") doAssert answers == "yes"Исходный код Редактировать proc removeSuffix(s: var string; chars: set[char] = Newlines) {...}{.gcsafe, extern: "nsuRemoveSuffixCharSet", raises: [], tags: [].}-
Удаляет все символы из
charsс конца строкиs(вместо копии).См. также:
Пример:
var userInput = "Hello World!*~\r\n" userInput.removeSuffix doAssert userInput == "Hello World!*~" userInput.removeSuffix({'~', '*'}) doAssert userInput == "Hello World!" var otherInput = "Hello!?!" otherInput.removeSuffix({'!', '?'}) doAssert otherInput == "Hello"Исходный код Редактировать proc removeSuffix(s: var string; c: char) {...}{.gcsafe, extern: "nsuRemoveSuffixChar", raises: [], tags: [].}-
Удаляет все вхождения одного символа (вместо копии) с конца строки.
См. также:
Пример:
var table = "users" table.removeSuffix('s') doAssert table == "user" var dots = "Trailing dots......." dots.removeSuffix('.') doAssert dots == "Trailing dots"Исходный код Редактировать proc removeSuffix(s: var string; suffix: string) {...}{.gcsafe, extern: "nsuRemoveSuffixString", raises: [], tags: [].}
-
Удалить первый соответствующий суффикс (внутри строки) из строки.
См. также:
Пример:
var answers = "yeses" answers.removeSuffix("es") doAssert answers == "yes"Исходный код Редактировать proc addSep(dest: var string; sep = ", "; startLen: Natural = 0) {...}{.noSideEffect, inline, raises: [], tags: [].}-
Добавляет разделитель к
destтолько если его длина большеstartLen.Это сокращённая запись для:
if dest.len > startLen: add(dest, sep)
Это часто полезно для генерации кода, где элементы должны быть разделены через
sep.sepдобавляется только еслиdestдлиннееstartLen. Следующий пример создаёт строку, описывающую массив целых чисел.Пример:
var arr = "[" for x in items([2, 3, 5, 7, 11]): addSep(arr, startLen = len("[")) add(arr, $x) add(arr, "]") doAssert arr == "[2, 3, 5, 7, 11]"Исходный код Редактировать proc allCharsInSet(s: string; theSet: set[char]): bool {...}{.raises: [], tags: [].}- Возвращает true, если каждый символ
sнаходится в набореtheSet.Пример:
doAssert allCharsInSet("aeea", {'a', 'e'}) == true doAssert allCharsInSet("", {'a', 'e'}) == trueИсходный код Редактировать proc abbrev(s: string; possibilities: openArray[string]): int {...}{.raises: [], tags: [].}-
Возвращает индекс первого элемента в
possibilities, начинающегося сs, если он однозначен.Возвращает -1, если элемент не найден, и -2, если найдено несколько соответствующих элементов.
Пример:
doAssert abbrev("fac", ["college", "faculty", "industry"]) == 1 doAssert abbrev("foo", ["college", "faculty", "industry"]) == -1 # Not found doAssert abbrev("fac", ["college", "faculty", "faculties"]) == -2 # Ambiguous doAssert abbrev("college", ["college", "colleges", "industry"]) == 0Исходный код Редактировать proc join(a: openArray[string]; sep: string = ""): string {...}{.noSideEffect, gcsafe, extern: "nsuJoinSep", raises: [], tags: [].}- Объединяет все строки в контейнере
a, разделяя их с помощьюsep.Пример:
doAssert join(["A", "B", "Conclusion"], " -> ") == "A -> B -> Conclusion"
Исходный код Редактировать proc join[T: not string](a: openArray[T]; sep: string = ""): string {...}{. noSideEffect, gcsafe.}- Преобразует все элементы в контейнере
aв строки с помощью$и объединяет их сsep.Пример:
doAssert join([1, 2, 3], " -> ") == "1 -> 2 -> 3"
Исходный код Редактировать proc initSkipTable(a: var SkipTable; sub: string) {...}{.noSideEffect, gcsafe, extern: "nsuInitSkipTable", raises: [], tags: [].}- Предварительно обрабатывает таблицу
aдляsub. Исходный код Редактировать proc find(a: SkipTable; s, sub: string; start: Natural = 0; last = 0): int {...}{. noSideEffect, gcsafe, extern: "nsuFindStrA", raises: [], tags: [].}-
Ищет
subвsв пределах диапазонаstart..lastс использованием предварительно обработанной таблицыa. Еслиlastне указано, оно по умолчанию равноs.high(последний элемент).Поиск регистрозависимый. Если
Исходный код Редактироватьsubне найдено вs, возвращается -1. proc find(s: string; sub: char; start: Natural = 0; last = 0): int {...}{. noSideEffect, gcsafe, extern: "nsuFindChar", raises: [], tags: [].}-
Ищет
subвsв пределах диапазонаstart..last(включая оба конца). Еслиlastне указано, оно по умолчанию равноs.high(последний элемент).Поиск регистрозависимый. Если
subне найдено вs, возвращается -1. В противном случае возвращаемый индекс относится кs[0], а не кstart. Используйтеs[start..last].rfindдля индекса, отсчитываемого отstart.См. также:
Исходный код Редактировать proc find(s: string; chars: set[char]; start: Natural = 0; last = 0): int {...}{. noSideEffect, gcsafe, extern: "nsuFindCharSet", raises: [], tags: [].}-
Ищет
charsвsв пределах диапазонаstart..last(включая оба конца). Еслиlastне указано, оно по умолчанию равноs.high(последний элемент).Если
sне содержит ни одного символа изchars, возвращается -1. В противном случае возвращаемый индекс относится кs[0], а не кstart. Используйтеs[start..last].findдля индекса, отсчитываемого отstart.См. также:
Исходный код Редактировать proc find(s, sub: string; start: Natural = 0; last = 0): int {...}{.noSideEffect, gcsafe, extern: "nsuFindStr", raises: [], tags: [].}-
Ищет
subвsв пределах диапазонаstart..last(включая оба конца). Еслиlastне указано, оно по умолчанию равноs.high(последний элемент).Поиск регистрозависимый. Если
subне найдено вs, возвращается -1. В противном случае возвращаемый индекс относится кs[0], а не кstart. Используйтеs[start..last].findдля индекса, отсчитываемого отstart.См. также:
Исходный код Редактировать proc rfind(s: string; sub: char; start: Natural = 0; last = -1): int {...}{. noSideEffect, gcsafe, extern: "nsuRFindChar", raises: [], tags: [].}-
Ищет
subвsв пределах диапазонаstart..last(включая оба конца) в обратном порядке — начиная с высоких индексов и двигаясь вниз к первому символу илиstart. Еслиlastне указано, оно по умолчанию равноs.high(последний элемент).Поиск регистрозависимый. Если
subне найдено вs, возвращается -1. В противном случае возвращаемый индекс относится кs[0], а не кstart. Используйтеs[start..last].findдля индекса, отсчитываемого отstart.См. также:
Исходный код Редактировать proc rfind(s: string; chars: set[char]; start: Natural = 0; last = -1): int {...}{. noSideEffect, gcsafe, extern: "nsuRFindCharSet", raises: [], tags: [].}-
Ищет
charsвsв пределах диапазонаstart..last(включая оба конца) в обратном порядке — начиная с высоких индексов и двигаясь вниз к первому символу илиstart. Еслиlastне указано, оно по умолчанию равноs.high(последний элемент).Если
sне содержит ни одного символа изchars, возвращается -1. В противном случае возвращаемый индекс относится кs[0], а не кstart. Используйтеs[start..last].rfindдля индекса, отсчитываемого отstart.См. также:
Исходный код Редактировать proc rfind(s, sub: string; start: Natural = 0; last = -1): int {...}{.noSideEffect, gcsafe, extern: "nsuRFindStr", raises: [], tags: [].}-
Ищет
subвsв пределах диапазонаstart..last(включая оба конца) в обратном порядке — начиная с высоких индексов и двигаясь вниз к первому символу илиstart. Еслиlastне указано, оно по умолчанию равноs.high(последний элемент).Поиск регистрозависимый. Если
subне найдено вs, возвращается -1. В противном случае возвращаемый индекс относится кs[0], а не кstart. Используйтеs[start..last].rfindдля индекса, отсчитываемого отstart.См. также:
Исходный код Редактировать proc count(s: string; sub: char): int {...}{.noSideEffect, gcsafe, extern: "nsuCountChar", raises: [], tags: [].}-
Подсчитать количество вхождений символа
subв строкеs.См. также:
Исходный код Редактировать proc count(s: string; subs: set[char]): int {...}{.noSideEffect, gcsafe, extern: "nsuCountCharSet", raises: [], tags: [].}-
Подсчитать количество вхождений группы символов
subsв строкеs.См. также:
Исходный код Редактировать proc count(s: string; sub: string; overlapping: bool = false): int {...}{. noSideEffect, gcsafe, extern: "nsuCountString", raises: [], tags: [].}
-
Подсчитайте количество вхождений подстроки
subв строкеs. Перекрывающиеся вхожденияsubучитываются только тогда, когдаoverlappingустановлено в значение true (по умолчанию: false).См. также:
Исходный код Редактировать proc countLines(s: string): int {...}{.noSideEffect, gcsafe, extern: "nsuCountLines", raises: [], tags: [].}-
Возвращает количество строк в строке
s.Это то же самое, что и
len(splitLines(s)), но значительно эффективнее, потому что не изменяет строку, не создавая временных объектов. Поддерживаются все комбинации символов новой строки (CR, LF, CR-LF).В данном контексте строка — это любая строка, разделенная комбинацией символов новой строки. Строка может быть пустой.
См. также:
Пример:
doAssert countLines("First line\l and second line.") == 2Исходный код Редактировать proc contains(s, sub: string): bool {...}{.noSideEffect, raises: [], tags: [].}-
То же самое, что и
find(s, sub) >= 0.См. также:
Исходный код Редактировать proc contains(s: string; chars: set[char]): bool {...}{.noSideEffect, raises: [], tags: [].}-
То же самое, что и
find(s, chars) >= 0.См. также:
Исходный код Редактировать proc replace(s, sub: string; by = ""): string {...}{.noSideEffect, gcsafe, extern: "nsuReplaceStr", raises: [], tags: [].}-
Заменяет
subвsстрокойby.См. также:
- процедура find
- процедура replace для замены отдельных символов
- процедура replaceWord
- процедура multiReplace
proc replace(s: string; sub, by: char): string {...}{.noSideEffect, gcsafe, extern: "nsuReplaceChar", raises: [], tags: [].}-
Заменяет
subвsсимволомby.Оптимизированная версия replace для символов.
См. также:
Исходный код Редактировать proc replaceWord(s, sub: string; by = ""): string {...}{.noSideEffect, gcsafe, extern: "nsuReplaceWord", raises: [], tags: [].}-
Заменяет
subвsстрокойby.Каждое вхождение
Исходный код Редактироватьsubдолжно быть окружено границами слова (сравнимо с\bв регулярных выражениях), в противном случае оно не будет заменено. proc multiReplace(s: string; replacements: varargs[(string, string)]): string {...}{. noSideEffect, raises: [], tags: [].}-
То же самое, что replace, но специализировано для выполнения нескольких замещений за один проход по входной строке.
multiReplaceвыполняет все замены за один проход, что означает, что он может использоваться, например, для обмена вхождениями «a» и «b».Если результирующая строка не длиннее исходной входной строки, требуется только одно выделение памяти.
Порядок замещений имеет значение. Ранние замены имеют приоритет над последующими в списке аргументов.
Исходный код Редактировать proc insertSep(s: string; sep = '_'; digits = 3): string {...}{.noSideEffect, gcsafe, extern: "nsuInsertSep", raises: [], tags: [].}-
Вставляет разделитель
sepпослеdigitsсимволов (по умолчанию: 3) справа налево.Несмотря на то, что алгоритм работает с любой строкой
s, он полезен только еслиsсодержит число.Пример:
doAssert insertSep("1000000") == "1_000_000"Исходный код Редактировать proc escape(s: string; prefix = "\""; suffix = "\""): string {...}{.noSideEffect, gcsafe, extern: "nsuEscape", raises: [], tags: [].}-
Экранирует строку
s. См. system.addEscapedChar для схемы экранирования.Полученная строка предваряется
prefixи завершаетсяsuffix. Оба значения могут быть пустыми строками.См. также:
- процедура unescape для обратного
действия
Исходный код Редактировать proc unescape(s: string; prefix = "\""; suffix = "\""): string {...}{.noSideEffect, gcsafe, extern: "nsuUnescape", raises: [ValueError], tags: [].}-
Раскрашивает строку
s.Это дополнение к процедуре escape, так как выполняет обратные операции.
Если
Исходный код Редактироватьsне начинается сprefixи не заканчиваетсяsuffixбудет возбуждено исключение ValueError. proc validIdentifier(s: string): bool {...}{.noSideEffect, gcsafe, extern: "nsuValidIdentifier", raises: [], tags: [].}-
Возвращает true, если
sявляется допустимым идентификатором.Допустимый идентификатор начинается с символа из набора
IdentStartCharsи далее содержит любое количество символов из набораIdentChars.Пример:
doAssert "abc_def08".validIdentifier
Исходный код Редактировать proc formatBiggestFloat(f: BiggestFloat; format: FloatFormatMode = ffDefault; precision: range[-1 .. 32] = 16; decimalSep = '.'): string {...}{. noSideEffect, gcsafe, extern: "nsu$1", raises: [], tags: [].}-
Преобразует значение с плавающей запятой
fв строку.Если
format == ffDecimalто точность — это количество цифр, отображаемых после десятичной точки. Еслиformat == ffScientificто точность — это максимальное количество значащих цифр для вывода. Значение по умолчанию дляprecision— максимальное количество значащих цифр после десятичной точки для типаbiggestFloatв Nim.Если
precision == -1, то будет выполнена попытка красивого форматирования.Пример:
let x = 123.456 doAssert x.formatBiggestFloat() == "123.4560000000000" doAssert x.formatBiggestFloat(ffDecimal, 4) == "123.4560" doAssert x.formatBiggestFloat(ffScientific, 2) == "1.23e+02"
Исходный код Редактировать proc formatFloat(f: float; format: FloatFormatMode = ffDefault; precision: range[-1 .. 32] = 16; decimalSep = '.'): string {...}{. noSideEffect, gcsafe, extern: "nsu$1", raises: [], tags: [].}-
Преобразует значение с плавающей запятой
fв строку.Если
format == ffDecimalто точность — это количество цифр, отображаемых после десятичной точки. Еслиformat == ffScientificто точность — это максимальное количество значащих цифр для вывода. Значение по умолчанию дляprecision— максимальное количество значащих цифр после десятичной точки для типаfloatв Nim.Если
precision == -1, то будет выполнена попытка красивого форматирования.Пример:
let x = 123.456 doAssert x.formatFloat() == "123.4560000000000" doAssert x.formatFloat(ffDecimal, 4) == "123.4560" doAssert x.formatFloat(ffScientific, 2) == "1.23e+02"
Исходный код Редактировать proc trimZeros(x: var string; decimalSep = '.') {...}{.noSideEffect, raises: [], tags: [].}-
Удаляет завершающие нули из отформатированного значения с плавающей запятой
x(должно быть объявлено какvar).Это изменяет
xнепосредственно, а не возвращает копию.Пример:
var x = "123.456000000" x.trimZeros() doAssert x == "123.456"
Исходный код Редактировать proc formatSize(bytes: int64; decimalSep = '.'; prefix = bpIEC; includeSpace = false): string {...}{.noSideEffect, raises: [], tags: [].}-
Округляет и форматирует
bytes.По умолчанию использует стандартные двоичные префиксы IEC/ISO, поэтому 1024 будет отформатировано как 1KiB. Установите prefix в
bpColloquialдля использования общеупотребительных названий из стандарта SI (например, k для 1000, повторно используемого для 1024).includeSpaceможет быть установлено в значение true для включения пробела между числом и единицей (например, 1 KiB).См. также:
- модуль strformat для интерполяции строк и форматирования
Пример:
doAssert formatSize((1'i64 shl 31) + (300'i64 shl 20)) == "2.293GiB" doAssert formatSize((2.234*1024*1024).int) == "2.234MiB" doAssert formatSize(4096, includeSpace = true) == "4 KiB" doAssert formatSize(4096, prefix = bpColloquial, includeSpace = true) == "4 kB" doAssert formatSize(4096) == "4KiB" doAssert formatSize(5_378_934, prefix = bpColloquial, decimalSep = ',') == "5,13MB"
Исходный код Редактировать proc formatEng(f: BiggestFloat; precision: range[0 .. 32] = 10; trim: bool = true; siPrefix: bool = false; unit: string = ""; decimalSep = '.'; useUnitSpace = false): string {...}{.noSideEffect, raises: [], tags: [].}
-
Преобразует значение с плавающей точкой
fв строку с использованием инженерной нотации.Числа в диапазоне -1000.0<f<1000.0 будут отформатированы без экспоненты. Числа вне этого диапазона будут отформатированы как мантисса в диапазоне -1000.0<f<1000.0 и экспонента, которая всегда будет целым кратным 3, соответствующим масштабу SI-префиксов k, M, G, T и т. д. для чисел со значением больше 1 и m, μ, n, p и т. д. для чисел со значением меньше 1.
По умолчанию (
trim=trueиprecision=10) отображается наиболее краткая форма, которая точно (до максимума 10 десятичных знаков) отображает значение. Например, 4.100000 будет отображено как 4.1 (математически идентично), а 4.1000003 — как 4.1000003.Если
trimустановлено в true, хвостовые нули будут удалены; если false, количество цифр, указанноеprecision, всегда будет отображено.precisionможет быть использовано для задания количества цифр после десятичной точки или (еслиtrimимеет значение true) максимального количества отображаемых цифр.formatEng(0, 2, trim=false) == "0.00" formatEng(0, 2) == "0" formatEng(0.053, 0) == "53e-3" formatEng(52731234, 2) == "52.73e6" formatEng(-52731234, 2) == "-52.73e6"
Если
siPrefixустановлено в true, число будет отображаться с SI-префиксом, соответствующим экспоненте. Например, 4100 будет отображаться как "4.1 k" вместо "4.1e3". Обратите внимание, чтоuиспользуется для микро- вместо греческой буквы мю (μ) в соответствии с ISO 2955. Числа со значением вне диапазона 1e-18<f<1000e18 (1a<f<1000E) будут отображаться с экспонентой вместо SI-префикса, независимо от того,siPrefixимеет значение true или нет.Если
useUnitSpaceимеет значение true, предоставленный единица будет добавлен к строке (со знаком пробела, как того требует стандарт SI). Это поведение немного отличается от добавления единицы к результату, так как положение пробела изменяется в зависимости от того, есть ли экспонента.formatEng(4100, siPrefix=true, unit="V") == "4.1 kV" formatEng(4.1, siPrefix=true, unit="V") == "4.1 V" formatEng(4.1, siPrefix=true) == "4.1" # Note lack of space formatEng(4100, siPrefix=true) == "4.1 k" formatEng(4.1, siPrefix=true, unit="") == "4.1 " # Space with unit="" formatEng(4100, siPrefix=true, unit="") == "4.1 k" formatEng(4100) == "4.1e3" formatEng(4100, unit="V") == "4.1e3 V" formatEng(4100, unit="", useUnitSpace=true) == "4.1e3 " # Space with useUnitSpace=true
decimalSepиспользуется в качестве разделителя десятичных знаков.См. также:
- Модуль strformat для интерполяции и форматирования строк
proc addf(s: var string; formatstr: string; a: varargs[string, `$`]) {...}{. noSideEffect, gcsafe, extern: "nsuAddf", raises: [ValueError], tags: [].}- То же самое, что и
add(s, formatstr % a), но более эффективно. Исходный код Редактировать proc `%`(formatstr: string; a: openArray[string]): string {...}{.noSideEffect, gcsafe, extern: "nsuFormatOpenArray", raises: [ValueError], tags: [].}-
Интерполирует строку формата со значениями из
a.Оператор подстановки выполняет подстановки строк в
formatstrи возвращает изменённуюformatstr. Это часто называется интерполяцией строк.Лучше всего это объяснить на примере:
"$1 eats $2." % ["The cat", "fish"]
Результат:
"The cat eats fish."
Переменные подстановки (то, что после
$) нумеруются от 1 доa.len. Чтобы получить строку без изменений, используйте$$. Нотация$#может использоваться для ссылки на следующую переменную подстановки:"$# eats $#." % ["The cat", "fish"]
Переменные подстановки также могут быть словами (то есть
[A-Za-z_]+[A-Za-z0-9_]*), в этом случае аргументы вaс чётными индексами являются ключами, а с нечётными — соответствующими значениями. Пример:"$animal eats $food." % ["animal", "The cat", "food", "fish"]
Результат:
"The cat eats fish."
Переменные сравниваются с
cmpIgnoreStyle.ValueErrorгенерируется, если в оператор%была передана некорректно сформированная строка формата.См. также:
- Модуль strformat для интерполяции и форматирования строк
proc `%`(formatstr, a: string): string {...}{.noSideEffect, gcsafe, extern: "nsuFormatSingleElem", raises: [ValueError], tags: [].}- Это то же самое, что и
formatstr % [a](см. % proc). Исходный код Редактировать proc format(formatstr: string; a: varargs[string, `$`]): string {...}{.noSideEffect, gcsafe, extern: "nsuFormatVarargs", raises: [ValueError], tags: [].}-
Это то же самое, что и
formatstr % a(см. % proc), за исключением того, что оно поддерживает автоматическое преобразование в строку.См. также:
- Модуль strformat для интерполяции и форматирования строк
proc strip(s: string; leading = true; trailing = true; chars: set[char] = Whitespace): string {...}{.noSideEffect, gcsafe, extern: "nsuStrip", raises: [], tags: [].}-
Удаляет ведущие или хвостовые
chars(по умолчанию: символы пробела) изsи возвращает получившуюся строку.Если
leadingимеет значение true (по умолчанию), ведущиеcharsудаляются. Еслиtrailingимеет значение true (по умолчанию), хвостовыеcharsудаляются. Если оба значения false, строка возвращается без изменений.См. также:
Пример:
let a = " vhellov " let b = strip(a) doAssert b == "vhellov" doAssert a.strip(leading = false) == " vhellov" doAssert a.strip(trailing = false) == "vhellov " doAssert b.strip(chars = {'v'}) == "hello" doAssert b.strip(leading = false, chars = {'v'}) == "vhello" let c = "blaXbla" doAssert c.strip(chars = {'b', 'a'}) == "laXbl" doAssert c.strip(chars = {'b', 'a', 'l'}) == "X"Исходный код Редактировать proc stripLineEnd(s: var string) {...}{.raises: [], tags: [].}- Возвращает
sс удалёнными одним из этих суффиксов:\r, \n, \r\n, \f, \v(по максимуму один экземпляр). Например, может быть полезно в сочетании сosproc.execCmdEx. Также известно как: chompПример:
var s = "foo\n\n" s.stripLineEnd doAssert s == "foo\n" s = "foo\r\n" s.stripLineEnd doAssert s == "foo"
Исходный код Редактировать proc isEmptyOrWhitespace(s: string): bool {...}{.noSideEffect, gcsafe, extern: "nsuIsEmptyOrWhitespace", raises: [], tags: [].}- Проверяет, является ли
sпустой или состоит только из символов пробела. Исходный код Редактировать
Итераторы
iterator split(s: string; sep: char; maxsplit: int = -1): string {...}{.raises: [], tags: [].}-
Разделяет строку
sна подстроки с использованием одного разделителя.Подстроки разделены символом
sep. Код:for word in split(";;this;is;an;;example;;;", ';'): writeLine(stdout, word)Результат:
"" "" "this" "is" "an" "" "example" "" "" ""
См. также:
Исходный код Изменить iterator split(s: string; seps: set[char] = Whitespace; maxsplit: int = -1): string {...}{. raises: [], tags: [].}-
Разделяет строку
sна подстроки с использованием группы разделителей.Подстроки разделены подстрокой, содержащей только
seps.for word in split("this\lis an\texample"): writeLine(stdout, word)… генерирует этот вывод:
"this" "is" "an" "example"
И следующий код:
for word in split("this:is;an$example", {';', ':', '$'}): writeLine(stdout, word)… производит тот же вывод, что и первый пример. Код:
let date = "2012-11-20T22:08:08.398990" let separators = {' ', '-', ':', 'T'} for number in split(date, separators): writeLine(stdout, number)… приводит к:
"2012" "11" "20" "22" "08" "08.398990"
См. также:
Исходный код Изменить iterator split(s: string; sep: string; maxsplit: int = -1): string {...}{.raises: [], tags: [].}-
Разделяет строку
sна подстроки, используя строковый разделитель.Подстроки разделены строкой
sep. Код:for word in split("thisDATAisDATAcorrupted", "DATA"): writeLine(stdout, word)Результат:
"this" "is" "corrupted"
См. также:
Исходный код Изменить iterator rsplit(s: string; sep: char; maxsplit: int = -1): string {...}{.raises: [], tags: [].}- Разделяет строку
sна подстроки справа, используя строковый разделитель. Работает точно так же, как итератор split, но в обратном порядке.for piece in "foo:bar".rsplit(':'): echo pieceРезультат:
"bar" "foo"
Подстроки разделены справа символом
sep.См. также:
Исходный код Изменить iterator rsplit(s: string; seps: set[char] = Whitespace; maxsplit: int = -1): string {...}{. raises: [], tags: [].}- Разделяет строку
sна подстроки справа, используя строковый разделитель. Работает точно так же, как итератор split, но в обратном порядке.for piece in "foo bar".rsplit(WhiteSpace): echo piece
Результат:
"bar" "foo"
Подстроки разделены справа набором символов
sepsСм. также:
Исходный код Изменить iterator rsplit(s: string; sep: string; maxsplit: int = -1; keepSeparators: bool = false): string {...}{.raises: [], tags: [].}- Разделяет строку
sна подстроки справа, используя строковый разделитель. Работает точно так же, как итератор split, но в обратном порядке.for piece in "foothebar".rsplit("the"): echo pieceРезультат:
"bar" "foo"
Подстроки разделены справа строкой
sepСм. также:
Исходный код Изменить iterator splitLines(s: string; keepEol = false): string {...}{.raises: [], tags: [].}-
Разделяет строку
sна содержащие строки.Поддерживаются все комбинации символов новой строки (CR, LF, CR-LF). Результирующие строки не содержат концевых символов новой строки, если параметр
keepEolне установлен вtrue.Пример:
for line in splitLines("\nthis\nis\nan\n\nexample\n"): writeLine(stdout, line)Результат:
"" "this" "is" "an" "" "example" ""
См. также:
Исходный код Изменить iterator splitWhitespace(s: string; maxsplit: int = -1): string {...}{.raises: [], tags: [].}-
Разделяет строку
sпо пробелам, удаляя ведущие и хвостовые пробелы при необходимости. Еслиmaxsplitуказан и положителен, то не болееmaxsplitразделений.Следующий код:
let s = " foo \t bar baz " for ms in [-1, 1, 2, 3]: echo "------ maxsplit = ", ms, ":" for item in s.splitWhitespace(maxsplit=ms): echo '"', item, '"'… приведёт к:
------ maxsplit = -1: "foo" "bar" "baz" ------ maxsplit = 1: "foo" "bar baz " ------ maxsplit = 2: "foo" "bar" "baz " ------ maxsplit = 3: "foo" "bar" "baz"
См. также:
Исходный код Изменить iterator tokenize(s: string; seps: set[char] = Whitespace): tuple[token: string, isSep: bool] {...}{.raises: [], tags: [].}-
Токенизирует строку
sна подстроки.Подстроки разделены подстрокой, содержащей только
seps. Пример:for word in tokenize(" this is an example "): writeLine(stdout, word)Результат:
(" ", true) ("this", false) (" ", true) ("is", false) (" ", true) ("an", false) (" ", true) ("example", false) (" ", true)Исходный код Изменить
Экспорт
- toLower, toLower, toUpper, toUpper
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/strutils.html