为什么这段代码的结果是 789-123-456-456-456?

问题描述

System.out.printf("%3$d-%3d-%2$d-%<4d-%5d %n",123,456,789);

我对这段代码的预测是

789-123-456- 456-  789

但实际结果是

789-123-456- 456-  456

为什么 %5d 需要 456

解决方法

因为您使用了标志 $user = User::create([ 'username' => $request->username,'phonenumber' => $request->phonenumber,'device_serial_number' => $request->device_serial_number,'password' => bcrypt($request->password),'user_secret_key' => Str::random(60); ]); if($user){ $token = $user->user_secret_key; return response()->json(['token' => $token],200); } else{ return response('error'); } ,它重用了先前的参数索引,即 2,因此数字 465。

有关详细信息,请参阅 java.util.Formatter 文档。

参数索引 参数索引是一个十进制整数,表示参数在参数列表中的位置。第一个参数由“1$”引用,第二个参数由“2$”引用,依此类推

另一种按位置引用参数的方法是使用 '

<
,

来自 Formatter JavaDoc,“参数索引”部分:

格式说明符可以通过三种方式引用参数:

  • 显式索引在格式说明符包含参数索引时使用。
  • 相对索引在格式说明符包含“
  • 普通索引在格式说明符既不包含参数索引也不包含“

您的格式字符串“%3$d-%3d-%2$d-%

  • %3$d 使用显式索引来引用第三个参数 (789)
  • %3d 使用普通索引来引用第一个参数 (123)
  • %2$d 使用显式索引来引用第二个参数 (456)
  • %<4d 使用相对索引再次引用第二个参数
  • %5d 使用普通索引来引用第二个参数 (456)

关于为什么 %5d 引用第二个参数的问题可以这样回答:它引用第二个参数,因为它是使用普通索引的第二个格式说明符。