#java #android
#java #Android
Вопрос:
Ну, мне нужно разделить строку, число и другую строку, чтобы получить результаты с суффиксами. У меня есть этот пример строки:
Пополните данные на 100000 только в вашем местоположении
Я смог получить этот журнал из строки выше с помощью этой функции в Java:
E/ numberMatches: Совпадения чисел: 10000
E/ formattedString: formattedString: 10k
Вот код строковой функции преобразования в суффиксы:
// code in GeneralUtils.java file
public static String extractNumber(final String str) {
if (str == null || str.isEmpty()) return "";
StringBuilder sb = new StringBuilder();
boolean found = false;
for (char c: str.toCharArray()) {
if (Character.isDigit(c)) {
sb.append(c);
found = true;
} else if (found) {
break;
}
}
return sb.toString();
}
private static final NavigableMap < Long, String > thousandSuffixes = new TreeMap < > ();
static {
thousandSuffixes.put(1 _000L, "k");
thousandSuffixes.put(1 _000_000L, "M");
thousandSuffixes.put(1 _000_000_000L, "G");
thousandSuffixes.put(1 _000_000_000_000L, "T");
thousandSuffixes.put(1 _000_000_000_000_000L, "P");
thousandSuffixes.put(1 _000_000_000_000_000_000L, "E");
}
public static String formatSuffixes(long value) {
if (value == Long.MIN_VALUE) return formatSuffixes(Long.MIN_VALUE 1);
if (value < 0) return "-" formatSuffixes(-value);
if (value < 1000) return Long.toString(value);
Map.Entry < Long, String > e = thousandSuffixes.floorEntry(value);
Long divideBy = e.getKey();
String suffix = e.getValue();
long truncated = value / (divideBy / 10);
boolean hasDecimal = truncated < 100 amp;amp; (truncated / 10 d) != (truncated / 10);
return hasDecimal ? (truncated / 10 d) suffix : (truncated / 10) suffix;
}
и вот код для получения результата из приведенной выше функции:
String product = productCategory.getProductName();
String number = GeneralUtils.extractNumber(product);
String formattedString = GeneralUtils.formatSuffixes(Long.valueOf(number));
Log.e("numberMatches", "numberMatches: " number);
Log.e("formattedString", "formattedString: " formattedString);
Как мне соединить форматированную строку со строкой до и после, чтобы результат выглядел так в Android?
Пополните данные на 100 КБ только в вашем местоположении
Любая помощь будет высоко оценена.
Спасибо.
Комментарии:
1.
product.replaceAll("\b" number "\b", formattedString)
?2. @AndyTurner спасибо за ваш ответ, но что, если строка содержит число и строку более 2 раз? например: регулярное пополнение 100000 только 95000 на сегодня , его необходимо преобразовать в регулярное пополнение 100k только 95k на сегодня .
3. Затем сделайте это для обоих.
4. @AndyTurner есть ли какой-либо обходной путь для создания динамической функции, которая будет определять, есть ли в строке какое-либо число тысяч, которое преобразуется в суффиксы?
5. @AndyTurner Привет, твой код работает! Глупый я, я не понимал, что мне нужно создать новую переменную для product.replaceAll(«\b» number «\ b», formattedString) для работы. Хорошей идеей будет вставить ваш первый комментарий в ответ, чтобы я мог принять его в качестве ответа. Спасибо.
Ответ №1:
Используйте String.replaceAll
для замены вхождений number
на formattedString
:
String newProduct = product.replaceAll("\b" number "\b", formattedString);
Обратите внимание, что number
это должно быть окружено рабочими перерывами (как показано здесь), чтобы вы случайно не заменили, скажем, 1000
и начало 1000000
и get 1k000
.
Вы можете выполнить несколько замен в строке с помощью Matcher
:
Pattern pattern = Pattern.compile("\d "); // Do this once, store in a constant.
Matcher m = pattern.matcher(product);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String number = m.group();
String formattedString = GeneralUtils.formatSuffixes(Long.valueOf(number));
m.appendReplacement(sb, formattedString);
}
m.appendTail(sb);
String newProduct = sb.toString();