+ return this;
+ }
+
+ public String2 trimSuffixIfExists(String suffix) {
+ if (hasSuffix(suffix))
+ trimSuffix(suffix.length());
+
+ return this;
+ }
+
+ public String2 trimSuffix(int charsToTrim) {
+
+ if (charsToTrim > chars.size()) {
+ chars.clear();
+ return this;
+ }
+
+ for (int i = 0; i < charsToTrim; i++)
+ chars.remove(chars.size() - 1);
+
+ return this;
+ }
+
+ public boolean hasSuffix(String suffix) {
+ return contains(suffix, getLength() - suffix.length());
+ }
+
+ public boolean hasPrefix(String prefix) {
+ return contains(prefix, 0);
+ }
+
+ public boolean contains(String fragment, int index) {
+ if (index + fragment.length() > chars.size())
+ return false;
+
+ for (int i = 0; i < fragment.length(); i++)
+ if (chars.get(index + i) != fragment.charAt(i))
+ return false;
+
+ return true;
+ }
+
+ public String2 enforceLength(final int targetLength) {
+ if (getLength() > targetLength)
+ chars.subList(targetLength, getLength()).clear();
+ else if (getLength() < targetLength) {
+ final int charactersToAdd = targetLength - getLength();
+ for (int i = 0; i < charactersToAdd; i++)
+ chars.add(' ');
+ }
+
+ return this;
+ }
+
+ public int getLength() {
+ return chars.size();
+ }
+
+ public String getSubString(final int startInclusive, final int endExclusive) {
+ final char[] charArray = new char[endExclusive - startInclusive];
+
+ int j = 0;
+ for (int i = startInclusive; i < endExclusive; i++) {
+ charArray[j] = chars.get(i);
+ j++;
+ }
+ return new String(charArray);
+ }
+
+ public boolean isEmpty() {
+ return chars.size() == 0;
+ }
+
+ @Override
+ public String toString() {
+ return getSubString(0, chars.size());
+ }