首页 > 其他分享 >核心(Hutool-core)类型转换

核心(Hutool-core)类型转换

时间:2024-06-14 11:13:28浏览次数:13  
标签:类型转换 core Convert 转换 String Hutool 字符串 UTF

在Java开发中我们要面对各种各样的类型转换问题,尤其是从命令行获取的用户参数、从HttpRequest获取的Parameter等等,这些参数类型多种多样,我们怎么去转换他们呢?常用的办法是先整成String,然后调用XXX.parseXXX方法,还要承受转换失败的风险,不得不加一层try catch,这个小小的过程混迹在业务代码中会显得非常难看和臃肿。

#Convert类
Convert类可以说是一个工具方法类,里面封装了针对Java常见类型的转换,用于简化类型转换。Convert类中大部分方法为toXXX,参数为Object,可以实现将任意可能的类型转换为指定类型。同时支持第二个参数defaultValue用于在转换失败时返回一个默认值。

#Java常见类型转换
转换为字符串:
int a = 1;
//aStr为"1"
String aStr = Convert.toStr(a);

long[] b = {1,2,3,4,5};
//bStr为:"[1, 2, 3, 4, 5]"
String bStr = Convert.toStr(b);
转换为指定类型数组:
String[] b = { "1", "2", "3", "4" };
//结果为Integer数组
Integer[] intArray = Convert.toIntArray(b);

long[] c = {1,2,3,4,5};
//结果为Integer数组
Integer[] intArray2 = Convert.toIntArray(c);
转换为日期对象:
String a = "2017-05-06";
Date value = Convert.toDate(a);
转换为集合
Object[] a = {"a", "你", "好", "", 1};
List list = Convert.convert(List.class, a); //从4.1.11开始可以这么用 List list = Convert.toList(a);
#其它类型转换
标准类型
通过Convert.convert(Class, Object)方法可以将任意类型转换为指定类型,Hutool中预定义了许多类型转换,例如转换为URI、URL、Calendar等等,这些类型的转换都依托于ConverterRegistry类。通过这个类和Converter接口,我们可以自定义一些类型转换。详细的使用请参阅“自定义类型转换”一节。

泛型类型
通过convert(TypeReference reference, Object value)方法,自行new一个TypeReference对象可以对嵌套泛型进行类型转换。例如,我们想转换一个对象为List类型,此时传入的标准Class就无法满足要求,此时我们可以这样:

Object[] a = { "a", "你", "好", "", 1 };
List list = Convert.convert(new TypeReference<List>() {}, a);
通过TypeReference实例化后制定泛型类型,即可转换对象为我们想要的目标类型。

#半角和全角转换
在很多文本的统一化中这两个方法非常有用,主要对标点符号的全角半角转换。

半角转全角:

String a = "123456789";

//结果为:"123456789"
String sbc = Convert.toSBC(a);
全角转半角:

String a = "123456789";

//结果为"123456789"
String dbc = Convert.toDBC(a);
#16进制(Hex)
在很多加密解密,以及中文字符串传输(比如表单提交)的时候,会用到16进制转换,就是Hex转换,为此Hutool中专门封装了HexUtil工具类,考虑到16进制转换也是转换的一部分,因此将其方法也放在Convert类中,便于理解和查找,使用同样非常简单:

转为16进制(Hex)字符串

String a = "我是一个小小的可爱的字符串";

//结果:"e68891e698afe4b880e4b8aae5b08fe5b08fe79a84e58fafe788b1e79a84e5ad97e7aca6e4b8b2"
String hex = Convert.toHex(a, CharsetUtil.CHARSET_UTF_8);
将16进制(Hex)字符串转为普通字符串:

String hex = "e68891e698afe4b880e4b8aae5b08fe5b08fe79a84e58fafe788b1e79a84e5ad97e7aca6e4b8b2";

//结果为:"我是一个小小的可爱的字符串"
String raw = Convert.hexStrToStr(hex, CharsetUtil.CHARSET_UTF_8);

//注意:在4.1.11之后hexStrToStr将改名为hexToStr
String raw = Convert.hexToStr(hex, CharsetUtil.CHARSET_UTF_8);
因为字符串牵涉到编码问题,因此必须传入编码对象,此处使用UTF-8编码。 toHex方法同样支持传入byte[],同样也可以使用hexToBytes方法将16进制转为byte[]

Unicode和字符串转换

与16进制类似,Convert类同样可以在字符串和Unicode之间轻松转换:

String a = "我是一个小小的可爱的字符串";

//结果为:"\u6211\u662f\u4e00\u4e2a\u5c0f\u5c0f\u7684\u53ef\u7231\u7684\u5b57\u7b26\u4e32"
String unicode = Convert.strToUnicode(a);

//结果为:"我是一个小小的可爱的字符串"
String raw = Convert.unicodeToStr(unicode);
很熟悉吧?如果你在properties文件中写过中文,你会明白这个方法的重要性。

编码转换

在接收表单的时候,我们常常被中文乱码所困扰,其实大多数原因是使用了不正确的编码方式解码了数据。于是Convert.convertCharset方法便派上用场了,它可以把乱码转为正确的编码方式:

String a = "我不是乱码";
//转换后result为乱码
String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);
String raw = Convert.convertCharset(result, CharsetUtil.ISO_8859_1, "UTF-8");
Assert.assertEquals(raw, a);
注意 经过测试,UTF-8编码后用GBK解码,再用GBK编码后用UTF-8解码会存在某些中文转换失败的问题。

#时间单位转换
Convert.convertTime方法主要用于转换时长单位,比如一个很大的毫秒,我想获得这个毫秒数对应多少分:

long a = 4535345;

//结果为:75
long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);

金额大小写转换

面对财务类需求,Convert.digitToChinese将金钱数转换为大写形式:

double a = 67556.32;

//结果为:"陆万柒仟伍佰伍拾陆元叁角贰分"
String digitUppercase = Convert.digitToChinese(a);
注意 转换为大写只能精确到分(小数点儿后两位),之后的数字会被忽略。

#数字转换
数字转为英文表达
// ONE HUNDRED AND CENTS TWENTY THREE ONLY
String format = Convert.numberToWord(100.23);
数字简化
// 1.2k
String format1 = Convert.numberToSimple(1200, false);
数字转中文
数字转中文方法中,只保留两位小数

// 一万零八百八十九点七二
String f1 = Convert.numberToChinese(10889.72356, false);

// 使用金额大写
// 壹万贰仟陆佰伍拾叁
String f1 = Convert.numberToChinese(12653, true);
数字中文表示转换为数字
// 1012
String f1 = Convert.numberToChinese("一千零一十二");

原始类和包装类转换

有的时候,我们需要将包装类和原始类相互转换(比如Integer.class 和 int.class),这时候我们可以:

//去包装
Class<?> wrapClass = Integer.class;

//结果为:int.class
Class<?> unWraped = Convert.unWrap(wrapClass);

//包装
Class<?> primitiveClass = long.class;

//结果为:Long.class
Class<?> wraped = Convert.wrap(primitiveClass);

标签:类型转换,core,Convert,转换,String,Hutool,字符串,UTF
From: https://www.cnblogs.com/velloLei/p/18247429

相关文章

  • ASP.NET Core应用程序10:使用表单标签助手
      本章描述用于创建HTML表单的内置标签助手。这些标签助手确保表单提交到正确的操作或页面处理程序方法,并确保元素准确地表示特定的模型属性。  本章解释ASP.NETCore提供的创建HTML表单的功能。展示如何使用标签助手来选择表单目标和关联的imput、textarea和select......
  • 跟着杨中科学习(六)EFCore(四)
    自引用的组织结构树classOrgUnit{publiclongId{get;set;}publiclong?ParentId{get;set;}publicstringName{get;set;}publicOrgUnit?Parent{get;set;}publicList<OrgUnit>Children{get;set;}=newList<OrgUnit&g......
  • JAVA1 类型转换 题目
    题目JAVA1类型转换分析:代码:大佬代码:JAVA1类型转换描述设计一个方法,将一个小于2147483647的double类型变量以截断取整方式转化为int类型 输入描述:随机double类型变量 输出描述:转化后的int类型变量示例:输入:12.34输出:12输入:1.88输出:1分析:1.......
  • netcore HTTP Error 500.30 - ASP.NET Core app failed to start
    netcoreHTTPError500.30-ASP.NETCoreappfailedtostart 错误解释:HTTPError500.30表示在尝试启动ASP.NETCore应用程序时发生了错误。这通常是因为应用程序无法找到或无法正确加载.NETCore运行时或应用程序的相关依赖项。解决方法:确认.NETCore运行时已安装:检查......
  • 【ARM Coresight Debug 系列 -- ARMv8/v9 Watchpoint 软件实现地址监控详细介绍】
    请阅读【嵌入式开发学习必备专栏】文章目录ARMv8/v9WatchpointexceptionsWatchpoint配置信息读取ExecutionconditionsWatchpointdataaddresscomparisonsSizeofthedataaccessWatchpoint软件配置流程WatchpointType使用介绍WT,Bit[20]:WatchpointType......
  • pythonocc基础:OCC.Core.TopAbs 类简介
    在PythonOCC库中,OCC.Core.TopAbs模块定义了一系列枚举类型,这些枚举类型代表了拓扑形状的不同类别(Topology)。这些类别是构建和操作三维几何模型的基础,特别是在处理布尔运算、几何约束、参数化设计等复杂任务时。TopAbs类提供了统一的接口来识别和区分不同的拓扑元素,是OpenCASCAD......
  • 一步步了解C++类型转换:static_cast、const_cast、reinterpret_cast和dynamic_cast
    1. static_caststatic_cast 可以用于基础类型之间的转换,类层次结构中的父类和子类之间的转换,以及把 void* 转换成目标类型的指针等。静态类型转换示例:#include<iostream>classBase{};classDerived:publicBase{};intmain(){//基础数据类型int......
  • YOLO 模型的评估指标——IOU、Precision、Recall、F1-score、AP、mAP、
    一、置信度是什么?置信度用于评估模型对检测结果的信心程度下图中,绿色框A表示GroundTruth,也称GT,GT就是正确的标注(人工)二、IOU与TP、FP、FNiou:表示预测的边界框(或分割区域)与真实边界框(或分割区域)之间的交集与并集之间的比值。阈值:根据实际情况可调节IOU=0.5如果预......
  • NETCORE - Grpc 通信四种方式
    NETCORE-Grpc通信四种方式 项目搭建:https://www.cnblogs.com/1285026182YUAN/p/17679730.html GRPC支持四种通信方式,分别是:UNARY:这是一种最简单的客户端与服务端模式,其中客户端发送一个消息后,阻塞等待服务端回复一个消息。CLIENTSTREAMING:在这种模式下,客户端将......
  • JS类型转换面试题:[] == ![] 为true?
    前言OK,又是在学习的路上遇到了难点,今天拿来分享一哈。ok,话不多说,开始分享。下面是一道面试题console.log([]==![])你觉得上面的值打印为多少?我告诉你,打印的结果是true。如果你是猜对的或者不会可以看看我对这个问题的深度解剖,如果有大哥已经了解也欢迎在评论区指教一......