Как объединить суффиксы строк и чисел в Android / Java?

#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();