package com.ruoyi.common.utils; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.regex.Pattern; /** * @Description 桩号工具 * * @author liuwenge * @date 2024/1/17 14:43 */ public class StakeMarkUtils { /** * @Description 桩号格式校验 * * 正确格式: K060+010 * @author liuwenge * @date 2024/3/22 20:05 * @param stakeMark * @return boolean */ public static boolean checkStakeMark(String stakeMark){ if (StringUtils.isEmpty(stakeMark)){ return false; } Pattern pattern = Pattern.compile("^K\\d{3}\\+\\d{3}$"); return pattern.matcher(stakeMark).matches(); } /** * @Description 桩号转公里数 * * @author liuwenge * @date 2024/3/6 11:06 * @param stakeMark 桩号:"K123+123" * @return 公里数:123.123 */ public static String formatKilometre(String stakeMark){ if (!checkStakeMark(stakeMark)){ return ""; } return stakeMark.toLowerCase().replace("k","").replace("+","."); } /** * @Description 桩号转米 * * @author liuwenge * @date 2024/3/6 11:06 * @param stakeMark 桩号:"K123+123" * @return 公里数:123123 */ public static String formatMetre(String stakeMark){ if (!checkStakeMark(stakeMark)){ return ""; } return stakeMark.toLowerCase().replace("k","").replace("+",""); } /** * @Description 计算桩号距离(公里) * * @author liuwenge * @date 2024/1/17 14:45 * @param startStakeMark 开始桩号 * @param endStakeMark 结束桩号 * @return java.math.BigDecimal 距离 */ public static BigDecimal getKilometre(String startStakeMark, String endStakeMark){ if (!checkStakeMark(startStakeMark) || !checkStakeMark(endStakeMark)){ return BigDecimal.ZERO; } String start = startStakeMark.toLowerCase().replace("k","").replace("+","."); String end = endStakeMark.toLowerCase().replace("k","").replace("+","."); BigDecimal startKilometre = new BigDecimal(start); BigDecimal endKilometre = new BigDecimal(end); if (startKilometre.compareTo(endKilometre) > 0){ return startKilometre.subtract(endKilometre).setScale(3, RoundingMode.HALF_UP); } else { return endKilometre.subtract(startKilometre).setScale(3, RoundingMode.HALF_UP); } } /** * @Description 计算桩号距离(米) * * @author liuwenge * @date 2024/1/17 15:04 * @param startStakeMark 开始桩号 * @param endStakeMark 结束桩号 * @return java.math.BigDecimal 距离 */ public static BigDecimal getMetre(String startStakeMark, String endStakeMark){ if (!checkStakeMark(startStakeMark) || !checkStakeMark(endStakeMark)){ return BigDecimal.ZERO; } String start = startStakeMark.toLowerCase().replace("k","").replace("+","."); String end = endStakeMark.toLowerCase().replace("k","").replace("+","."); BigDecimal startKilometre = new BigDecimal(start); BigDecimal endKilometre = new BigDecimal(end); if (startKilometre.compareTo(endKilometre) > 0){ return startKilometre.subtract(endKilometre).multiply(new BigDecimal("1000")).setScale(0, RoundingMode.HALF_UP); } else { return endKilometre.subtract(startKilometre).multiply(new BigDecimal("1000")).setScale(0, RoundingMode.HALF_UP); } } }