Skip to content

Commit 62525e0

Browse files
committed
Добавлено больше функций для строк
1 parent 5cada73 commit 62525e0

File tree

3 files changed

+73
-2
lines changed

3 files changed

+73
-2
lines changed

src/main/java/com/annimon/ownlang/lib/Converters.java

+8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.annimon.ownlang.lib;
22

3+
import java.util.function.Predicate;
34
import static com.annimon.ownlang.lib.ValueUtils.getFloatNumber;
45

56
/**
@@ -192,4 +193,11 @@ public static FunctionValue stringToVoid(StringToVoidFunction f) {
192193
return NumberValue.ZERO;
193194
});
194195
}
196+
197+
public static FunctionValue stringToBoolean(Predicate<String> f) {
198+
return new FunctionValue(args -> {
199+
Arguments.check(1, args.length);
200+
return NumberValue.fromBoolean(f.test(args[0].asString()));
201+
});
202+
}
195203
}

src/main/java/com/annimon/ownlang/lib/StringValue.java

+30-2
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,38 @@ public Value access(Value propertyValue) {
2323
// Properties
2424
case "length":
2525
return NumberValue.of(length());
26+
case "lower":
27+
return new StringValue(value.toLowerCase());
28+
case "upper":
29+
return new StringValue(value.toUpperCase());
30+
case "chars": {
31+
final Value[] chars = new Value[length()];
32+
int i = 0;
33+
for (char ch : value.toCharArray()) {
34+
chars[i++] = NumberValue.of((int) ch);
35+
}
36+
return new ArrayValue(chars);
37+
}
2638

2739
// Functions
2840
case "trim":
29-
return new FunctionValue(args -> new StringValue(value.trim()));
41+
return Converters.voidToString(value::trim);
42+
case "startsWith":
43+
return new FunctionValue(args -> {
44+
Arguments.checkOrOr(1, 2, args.length);
45+
int offset = (args.length == 2) ? args[1].asInt() : 0;
46+
return NumberValue.fromBoolean(value.startsWith(args[0].asString(), offset));
47+
});
48+
case "endsWith":
49+
return Converters.stringToBoolean(value::endsWith);
50+
case "matches":
51+
return Converters.stringToBoolean(value::matches);
52+
case "contains":
53+
return Converters.stringToBoolean(value::contains);
54+
case "equalsIgnoreCase":
55+
return Converters.stringToBoolean(value::equalsIgnoreCase);
56+
case "isEmpty":
57+
return Converters.voidToBoolean(value::isEmpty);
3058

3159
default:
3260
if (Functions.isExists(prop)) {
@@ -42,7 +70,7 @@ public Value access(Value propertyValue) {
4270
}
4371
throw new UnknownPropertyException(prop);
4472
}
45-
73+
4674
public int length() {
4775
return value.length();
4876
}

src/test/resources/other/stringFunctions.own

+35
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,41 @@ def testTrim() {
99
assertEquals("test", s.trim())
1010
}
1111

12+
def testLower() {
13+
s = "TeST"
14+
assertEquals("test", s.lower)
15+
}
16+
17+
def testUpper() {
18+
s = "Test"
19+
assertEquals("TEST", s.upper)
20+
}
21+
22+
def testChars() {
23+
assertEquals([49, 50, 51, 52], "1234".chars)
24+
}
25+
26+
def testStartsWith() {
27+
s = "test"
28+
assertTrue(s.startsWith("tes"))
29+
assertTrue(s.startsWith("t"))
30+
assertFalse(s.startsWith("s"))
31+
}
32+
33+
def testEndsWith() {
34+
s = "test"
35+
assertTrue(s.endsWith("st"))
36+
assertTrue(s.endsWith("t"))
37+
assertFalse(s.endsWith("s"))
38+
}
39+
40+
def testIsEmpty() {
41+
assertFalse(" ".isEmpty())
42+
assertTrue(" ".trim().isEmpty())
43+
assertFalse("1234".isEmpty())
44+
assertTrue("".isEmpty())
45+
}
46+
1247
def testExtensionFunction() {
1348
use "std"
1449
s = "1es1"

0 commit comments

Comments
 (0)